jdbcConnection 是否有 ExceptionListener 支持,类似于 jmsConnection?

does jdbcConnection have ExceptionListener support, similar to jmsConnection?

我们使用 XA/distributed 事务,如果参与的 xaResource-branch 抛出异常,我正在尝试 notify/update 全局事务状态。

可以在 JMS Connection#setExceptionListener() 中找到一个很好的示例(参考 link),它在 ExceptionListener 中提供了通知挂钩。我正在寻找 JDBC 规范中的类似内容,但一直找不到。

XA 事务处理在我们的应用程序中是单线程的,一个给定的全局事务可以涉及多个 xaResource 分支。假设 UOW 按 rArBrC 的顺序发生,我们可能会在 rB 上有一个慢查询 运行,导致 rArC 开始之前超时。由于单线程的性质(以及我们使用的TM的限制),rC仍然在全局事务的命运已经确定(回滚)的情况下继续进行。我们正在尝试通知全局事务 rA 已经回滚,以便可以跳过 rC

如果 JDBC 规范不提供类似于 JMS 的 ExceptionListener 的东西,我能想到的一种选择是使用异步线程以特定频率测试 JDBC 连接.到目前为止,我发现的最接近的例子在这个 PostgreSQL 文档 (ref.link) 中有所描述,它使用异步线程到 test/poll JDBC 连接。它可能满足我的需要,但想知道我是否在 JDBC 规范中遗漏了任何其他选项。

JDBC 不为正常连接提供此功能,因此这就是您找不到它的原因。 JDBC 确实支持 PooledConnection(和 XAConnection)对象(ConnectionEventListenerStatementEventListener)上的侦听器,但这些侦听器用于从池连接到池的通信管理器(或事务管理器),不供一般使用。

如果你想要这样的东西,你需要自己写。例如,将连接包装在代理中,并用捕获异常、通知侦听器并重新抛出异常的东西对其进行修饰。

或者,检查您的资源管理器是否已经为此提供支持。但是,鉴于您处理的单线程性质,我想您不可能检测到 rA 在您通过异常侦听器处理 rB 时超时:资源将是等待提交,在您真正尝试提交之前不会通知超时。

异步检查连接听起来像是一个等待发生的大竞争条件,甚至假设您正在检查的错误是可以通过这种方式验证的。逻辑异常可能会使连接处于工作状态。