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

java.sql.SQLRecoverableException-从jdbc重新连接,java,spring,oracle,jdbc,oracle-sqldeveloper,Java,Spring,Oracle,Jdbc,Oracle Sqldeveloper,在我使用ApacheJDBC连接到数据库的应用程序中,我偶尔会看到“java.sql.SQLRecoverableException”。在搜索了根本原因之后,我发现这可能是由于oracle服务器端的连接终止造成的。我使用的是oracle 11G版本 现在我的要求是,在执行任何查询之前,我必须确保连接仍然有效并且没有终止。如果连接从oracle端终止,我需要建立新连接 我不知道我如何才能做到这一点,也不知道如何测试它。我已尝试从以下查询获取会话: 从用户名不为null的v$会话中选择*; 当我打

在我使用ApacheJDBC连接到数据库的应用程序中,我偶尔会看到“java.sql.SQLRecoverableException”。在搜索了根本原因之后,我发现这可能是由于oracle服务器端的连接终止造成的。我使用的是oracle 11G版本

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

我不知道我如何才能做到这一点,也不知道如何测试它。我已尝试从以下查询获取会话:

从用户名不为null的v$会话中选择*;
当我打开SQL Developer并且应用程序(使用相同用户凭据的两个应用程序)也打开时,它会显示一个结果。我想知道如何终止与SQL的连接,重新生成“SQLRecoverableException”进行测试,并在问题发生后重新连接到数据库

由于我对数据库连接还不熟悉,所以我不确定要实现这一点需要做什么或研究什么。请帮我解决这个问题

我在spring-servlet.xml中的JDBC连接如下所示:


某些防火墙或其他活动似乎正在断开连接。 在数据库终止空闲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>

请注意,NevictionRunsMillis之间的时间间隔以毫秒为单位


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

无法使用CommonDBCP中的use
validationQuery
参数。此行为应该由连接池完成。作为池中连接对象的用户,您应该最不担心tit。您可以将此链接用作reference@AbhijithNagarajan:如何测试它?如何断开应用程序会话与oracle的连接,以便查看它是否通过连接池自动重新连接如果您的数据库是群集的(oracle RAC),则您需要查询
gv$session
。请发布完整的异常stacktrace1。使用验证查询确认连接。使用Abhijith的建议,这可以是类似“从双重选择1”这样的简单操作。它将始终返回1,除非连接断开。