Изглежда, че връзката се прекъсва от някаква защитна стена или друга дейност. Срещнахме подобен проблем, при който базата данни прекъсваше връзките, които бяха неактивни в продължение на 30 минути.
За да преодолеем проблема, ние настроихме пула на базата данни, като посочихме следните свойства
testOnBorrow:-Setting it true will force the pooling provider to run the validation query while handing out the connection to the application.
testWhileIdle:-Setting it true will enable the validation when the connection is sitting idle in the pool.
timeBetweenEvictionRunsMillis:- Setting this property to non-zero will allow the evictor thread to run,which will test the idle connections.
Възпроизвеждането на проблема ще изисква прекратяване на връзката от страна на базата данни. Извършихме малък тест с помощта на mssql, при който можем да прекратим връзката с помощта на сървърните инструменти и пулът установяваше връзката отново.
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${myjdbc.driverClassName}" />
<property name="url" value="${myjdbc.url}" />
<property name="username" value="${myjdbc.username}" />
<property name="password" value="${myjdbc.password}" />
<property name="testOnBorrow" value="true" />
<property name="testWhileIdle" value="true" />
<property name="timeBetweenEvictionRunsMillis" value="3000" />
</bean>
Обърнете внимание, че timeBetweenEvictionRunsMillis е в милизонди.
Горната конфигурация ще провери невалидната връзка и ще ги премахне от пула, ако внезапно бъдат затворени от базата данни или защитната стена.