DBCPでloginTimeoutの設定の仕方

データベースサーバをVMで稼働させている際、
しばらくするとVMのリソース割り当てが下がってしまい、
DBMSへの接続に時間がかかってしまい、Javaのバッチ処理が
コネクションタイムアウトが発生しこけてしまう事態が発生しました。


Javaのバッチプログラムは、Spirng + Apache CommonsのDBCPを使用しています。
applicationContext.xmlには以下のような記述していました。

<bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp.BasicDataSource" destroy-method="close">
     <property name="driverClassName"><value>com.microsoft.sqlserver.jdbc.SQLServerDriver</value></property>
     <property name="url"><value>jdbc:sqlserver://192.168.0.12\sqlexpress:1433;databaseName=db;</value></property>
     <property name="username"><value>dbuser</value></property>
     <property name="password"><value>dbpass</value></property>
     <property name="initialSize"><value>10</value></property>
     <property name="maxIdle"><value>10</value></property>
     <property name="defaultAutoCommit"><value>True</value></property>
</bean>

この場合、タイムアウトはSQL Serverのデフォルトで15秒となります。
http://msdn.microsoft.com/ja-jp/library/ms378988.aspx


では、同じようにpropertyに loginTimeout を設定すると Exception が発生します。
BasicDataSourceのJavadocを参照すると、setLoginTimeoutには
BasicDataSource does NOT support this method.
と記載されています。



ここで諦めかけたのですが、urlで指定すればいいのではないかと思い試したところ
無事に設定することができました。

     <property name="url"><value>jdbc:sqlserver://192.168.0.12\sqlexpress:1433;databaseName=db;loginTimeout=60;</value></property>

URLにプロパティで設定できることは、MSの以下のページにも記載されていました。
http://msdn.microsoft.com/ja-jp/library/ms378428(v=sql.105).aspx



最後に、SQL Serverの勉強にオススメの書籍を紹介します。

SQL Server 2008の教科書―基礎から実践まで学べる

SQL Server 2008の教科書―基礎から実践まで学べる