【发布时间】:2019-09-30 08:22:53
【问题描述】:
在我使用 Apache JDBC 连接来连接数据库的应用程序中,我偶尔会收到“java.sql.SQLRecoverableException”。在搜索了根本原因后,我了解到它可能是由于与 oracle 服务器端的连接终止造成的。我用的是oracle 11G版本。
现在我的要求是在执行任何查询之前我必须确保连接仍然有效并且没有终止。如果连接从 oracle 端终止,我需要建立一个新连接。
我不确定如何实现或测试它。我尝试从以下查询中获取会话:
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" />
【问题讨论】:
-
不能使用来自 CommonsDBCP 的
validationQuery参数。这种行为应该是由连接池完成的。作为池中连接对象的用户,您应该最不担心山雀。 stackoverflow.com/questions/2548137/…你可以参考这个链接 -
@AbhijithNagarajan:我如何测试它?如何断开应用程序的会话与 oracle 的连接,以便我可以查看它是否自动通过连接池重新连接
-
如果您的数据库是集群的(Oracle RAC),那么您需要改为查询
gv$session。 -
请发布完整的异常堆栈跟踪
-
1.使用验证查询来确认连接。使用 Abhijith 的建议,这可以很简单,例如“从双重选择 1”。除非连接断开,否则它将始终返回 1。
标签: java spring oracle jdbc oracle-sqldeveloper