Sembra che la connessione sia stata interrotta da alcuni firewall o altre attività. Abbiamo riscontrato un problema simile in cui il database stava terminando le connessioni che erano inattive per 30 minuti.
Per superare il problema abbiamo ottimizzato il pool di database specificando le seguenti proprietà
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.
La riproduzione del problema richiederà l'interruzione della connessione sul lato del database. Abbiamo eseguito un piccolo test utilizzando mssql in cui è possibile terminare la connessione utilizzando gli strumenti del server e il pool ha stabilito di nuovo la connessione.
<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>
Nota che timeBetweenEvictionRunsMillis è in millisond.
La configurazione di cui sopra verificherà la connessione non valida e la rimuoverà dal pool se viene chiusa bruscamente dal database o dal firewall.