Wygląda na to, że połączenie zostało zerwane przez zaporę sieciową lub inną aktywność. Mieliśmy do czynienia z podobnym problemem, w którym baza danych przerywała połączenia, które były bezczynne przez 30 minut.
Aby rozwiązać ten problem, dostroiliśmy pulę baz danych, określając następujące właściwości
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.
Odtworzenie problemu będzie wymagało przerwania połączenia po stronie bazy danych. Przeprowadziliśmy mały test przy użyciu mssql, w którym możemy zakończyć połączenie za pomocą narzędzi serwera, a pula ponownie nawiązała połączenie.
<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>
Zwróć uwagę, że czas międzyEvictionRunsMillis wynosi miliony.
Powyższa konfiguracja sprawdzi nieprawidłowe połączenie i usunie je z puli, jeśli zostaną nagle zamknięte przez bazę danych lub zaporę.