-2

我们使用 XA/分布式事务,如果参与的 xaResource-branch 抛出异常,我正在尝试通知/更新全局事务状态。

一个很好的例子可以在 JMS 中找到Connection#setExceptionListener()(参考链接),它在ExceptionListener. 我在 JDBC 规范中寻找类似的东西,但我找不到任何东西。

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

如果 JDBC 规范不提供类似于 JMS 的 ExceptionListener 的功能,我能想到的一个选项是使用异步线程以特定频率测试 JDBC 连接。到目前为止,我发现的最接近的示例在此 PostgreSQL 文档(参考链接)中进行了描述,该文档使用异步线程来测试/轮询 JDBC 连接。它可能满足我的需要,但想知道我在 JDBC 规范中是否遗漏了任何其他选项。

4

1 回答 1

2

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

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

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

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

于 2019-08-08T09:45:17.297 回答