java.sql.SQLRecoverableException-从jdbc重新连接

时间:2019-05-13 11:18:59

标签: java spring oracle jdbc oracle-sqldeveloper

在使用Apache JDBC连接性连接到数据库的应用程序中,有时会遇到“ java.sql.SQLRecoverableException”。搜索根本原因后,我能够了解到它可能是由于从oracle服务器端终止连接而引起的。我正在使用oracle 11G版本。

现在,我的要求是在执行任何查询之前,必须确保连接仍然有效并且没有终止。如果连接从oracle end终止,我需要建立一个新连接。

我不确定如何实现或测试它。我尝试从以下查询获取会话:

select * from v$session where username is not null;

当我打开SQL Developer并且同时打开了应用程序(使用相同用户凭据的2个应用程序)时,它显示一个结果。我想知道如何终止与SQL的连接并重现“ SQLRecoverableException”以进行测试,并在出现问题后也重新连接到数据库。

由于我是数据库连接的新手,所以我不确定该怎么做或要研究什么才能实现此目的。请帮我解决这个问题。

spring-servlet.xml中的JDBC连接如下:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
</bean>

<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}" />
</bean>
<context:property-placeholder location="classpath:myjdbc.properties" />

1 个答案:

答案 0 :(得分:0)

似乎某些防火墙或其他活动正在断开连接。 我们遇到了类似的问题,即数据库终止了空闲30分钟的连接。

要解决此问题,我们通过指定以下属性来调整数据库池

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.

重现此问题将需要终止数据库侧的连接。我们已经使用mssql执行了一次小型测试,其中我们可以使用服务器工具终止连接,并且池重新建立连接。

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

请注意timeBetweenEvictionRunsMillis的单位为Millisonds。

以上配置将检查无效连接,如果数据库或防火墙突然将其关闭,则会将其从池中删除。