Het lijkt erop dat de verbinding wordt verbroken door een firewall of andere activiteit. We hebben een soortgelijk probleem gehad waarbij de database de verbindingen beëindigde die gedurende 30 minuten inactief waren.
Om het probleem op te lossen hebben we de databasepool afgestemd door de volgende eigenschappen op te geven
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.
Om het probleem te reproduceren, moet de verbinding aan de databasezijde worden verbroken. We hebben een kleine test uitgevoerd met mssql waarin we de verbinding kunnen beëindigen met behulp van de servertools en de pool de verbinding opnieuw tot stand heeft gebracht.
<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>
Merk op dat de tijd tussen EvictionRunsMillis in millisonen is.
De bovenstaande configuratie controleert de ongeldige verbinding en verwijdert ze uit de pool als ze abrupt worden afgesloten door de database of de firewall.