Oracle
 sql >> Datenbank >  >> RDS >> Oracle

java.sql.SQLRecoverableException - Wiederverbindung von jdbc

Es scheint, dass die Verbindung von einer Firewall oder einer anderen Aktivität unterbrochen wird. Wir hatten ein ähnliches Problem, bei dem die Datenbank die Verbindungen beendete, die 30 Minuten lang inaktiv waren.

Um das Problem zu lösen, haben wir den Datenbankpool optimiert, indem wir die folgenden Eigenschaften angegeben haben

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.

Um das Problem zu reproduzieren, muss die Verbindung auf der Datenbankseite beendet werden. Wir haben einen kleinen Test mit mssql durchgeführt, bei dem wir die Verbindung mit den Server-Tools beenden konnten und der Pool die Verbindung erneut herstellte.

<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>

Beachten Sie, dass timeBetweenEvictionRunsMillis in Millisonden angegeben ist.

Die obige Konfiguration überprüft die ungültigen Verbindungen und löscht sie aus dem Pool, wenn sie abrupt von der Datenbank oder der Firewall geschlossen werden.