Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jdbcConnection是否具有类似于jmsConnection的ExceptionListener支持?_Java_Jdbc_Distributed Transactions_Xa_Bitronix - Fatal编程技术网

Java jdbcConnection是否具有类似于jmsConnection的ExceptionListener支持?

Java jdbcConnection是否具有类似于jmsConnection的ExceptionListener支持?,java,jdbc,distributed-transactions,xa,bitronix,Java,Jdbc,Distributed Transactions,Xa,Bitronix,我们使用XA/分布式事务,如果参与的xaResource分支抛出异常,我将尝试通知/更新全局事务状态 JMSConnection#setExceptionListener(),(参考)中有一个很好的例子,它在ExceptionListener中提供了通知钩子。我正在寻找JDBC规范中类似的东西,但我还没有找到 XA事务处理在我们的应用程序中是单线程的,一个给定的全局事务可以触及多个xaResource分支。假设UOW按照rA、rB和rC的顺序发生,我们可能会在rB上运行缓慢的查询,导致rA在rC

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

JMS
Connection#setExceptionListener()
,(参考)中有一个很好的例子,它在
ExceptionListener
中提供了通知钩子。我正在寻找JDBC规范中类似的东西,但我还没有找到

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


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

JDBC没有为正常连接提供此选项,因此您无法找到它。JDBC确实支持
PooledConnection
(和
XAConnection
)对象(
ConnectionEventListener
StatementEventListener
)上的侦听器,但这些侦听器用于从池连接到池管理器(或事务管理器)的通信,不用于一般用途

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

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


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

此问题在文档中有完整的答案。