Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

java.sql.SQLRecoverableException - reconectar do jdbc


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.