きっかけ
Spring + Tomcatでの開発のときに、DBの接続エラーではまったので、そのときの設定メモ。
java6縛りでtomcatも古いバージョンの設定ですので、気を付けてください。
ポイントはvalidationQueryです。
コネクションの有効性テスト
一定時間たつとDBに接続できなくなったときは、プールしているコネクションがつかえなくなってる可能性が高いです。
こちら で同じ問題の解決策にでていました。
validationQueryの設定を追加で解消されます。Spring側でdatasourceを定義するなら、下記のようにします。
(RDBMSがMySQLの想定ですが、OracleDBでも同様です。)
applicationContext.xml
applicationContext.xml
<bean id="dataSource"
class="org.apache.tomcat.jdbc.pool.DataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/sample"/>
<property name="username" value="root" />
<property name="password" value="root" />
<property name="validationQuery" value="SELECT 1 FROM DUAL" />
<property name="testOnBorrow" value="true" />
<property name="testWhileIdle" value="true" />
<property name="timeBetweenEvictionRunsMillis" value="60000" />
</bean>
server.xml
Tomcat側で接続するDBを指定している場合は、server.xmlに上記の設定を追加します。
https://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html
http://ymotoba.blogspot.jp/2008/09/tomcat.html
server.xml
<Resource name="jdbc/sample"
global="jdbc/sample"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/sample"
username="root"
password="root"
maxActive="100"
maxIdle="20"
minIdle="5"
maxWait="10000"
validationQuery="SELECT 1 FROM DUAL"
testOnBorrow="true"
testWhileIdle="true"
timeBetweenEvictionRunsMillis="60000"
/>
applicationContext.xmlにはJNDIの設定に書き直します。
applicationContext.xml
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/sample"/>
</bean>
参考サイト