3

我有一种情况,JDBC 连接将它所连接的 Oracle 会话置于特定状态(即 DBMS_FLASHBACK 启用模式)。此模式的退出可能会失败(至少在理论上),这意味着会话错误地处于该状态。在这种情况下,连接可以返回到池中,并由另一个线程获得,Oracle 会话仍处于 DBMS_FLASHBACK 启用模式。

我已经证明这确实会发生。(JBoss 4.2.1)

理想的做法是在模式退出失败时捕获 SQLException,并将连接标记为“坏”,这样一旦它返回到池中,JBoss 就会破坏连接并创建一个新连接。

但是我找不到任何方法来标记立即销毁的连接。有谁知道一种方法?

4

2 回答 2

3

您的 Oracle 数据库连接配置应该包含一个异常排序器:

<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>

如果连接可以重用或必须断开连接,这将尝试确定何时发生异常。这是在尽最大努力的基础上,并非在所有情况下都有效。我对生产安装的偏好是将所有异常标记为致命。为此,只需将异常排序器设置为org.jboss.resource.adapter.jdbc.GenericExceptionSorter.

于 2009-05-29T06:22:15.610 回答
1

这是一个很好的问题,我不知道完整的答案,但一些调查途径是从 JBoss 故障转移机制开始,它测试连接的有效性。文档在这里。然后在测试有效性的 SQL 中,如果连接处于启用 DBMS_FLASHBACK 的模式下,如果可以放入会失败的东西,那应该让 JBoss 丢弃连接。它可能会测试下一个连接请求,而不是在它返回池时进行测试,尽管这应该是可以接受的。

于 2009-05-28T17:13:24.477 回答