Parece que a conexão está sendo interrompida por algum firewall ou outra atividade. Enfrentamos um problema semelhante em que o banco de dados encerrava as conexões que estavam ociosas por 30 minutos.
Para superar o problema, ajustamos o pool de banco de dados especificando as seguintes propriedades
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.
Reproduzir o problema exigirá encerrar a conexão no lado do banco de dados. Realizamos um pequeno teste usando mssql em que podemos encerrar a conexão usando as Ferramentas do Servidor e o pool estava estabelecendo a conexão novamente.
<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>
Observe que o timeBetweenEvictionRunsMillis está em milissegundos.
A configuração acima verificará a conexão inválida e as descartará do pool se forem fechadas abruptamente pelo banco de dados ou pelo firewall.