Det verkar som om anslutningen bryts av någon brandvägg eller annan aktivitet. Vi har stött på liknande problem där databasen avslutade anslutningarna som var inaktiva i 30 minuter.
För att lösa problemet har vi justerat databaspoolen genom att ange följande egenskaper
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.
Reproducering av problemet kräver att anslutningen på databassidan avbryts. Vi har utfört ett litet test med hjälp av mssql där vi kan avsluta anslutningen med hjälp av serververktygen och poolen upprättade anslutningen igen.
<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>
Observera att tiden BetweenEvictionRunsMillis är i millisond.
Ovanstående konfiguration kontrollerar den ogiltiga anslutningen och tar bort dem från poolen om de plötsligt stängs av databasen eller brandväggen.