java - 混合 JTA 和 JDBC 事务

标签 java jpa jdbc jms jta

我有一个带有 JMS 和 JPA 的 Java SE(!) 场景,我可能需要分布式事务以及“常规”JDBC 事务。我必须收听发送服务请求的队列,在接收时保留日志,处理请求并在处理请求后更新日志。仅当请求已成功处理时,消息才会被确认。

第一个想法是只使用 JTA(由 Bitronix 提供)。但是我面临两个问题:

  1. 如果无法处理请求,则不会保留任何日志
  2. 如果无法更新日志(不太可能但有可能),则不会处理请求

因此,另一个想法是使用常规 JDBC 事务创建和更新日志。只有请求事务的实体管理器会加入用户事务,而创建和更新日志的实体管理器会直接提交。

是否可以在单个持久性单元上“混合”JTA 和 JPA?或者我们是否已经有了用于这些类型的 JMS 和 JDBC 事务的模式?

最佳答案

我实际上用稍微不同的方法解决了我的问题。我没有“混合”JTA 和 JDBC 事务,而是使用suspendresume 来处理不同的用户事务。

任务仍然相同:我启动一个 (JTA) 用户事务,其中包含一些 JMS 和 JDBC 事务(接收消息、执行一些数据库操作)。在该工作流程的中间,我想写一个消息日志,但当“外部”事务失败时,该日志记录不应回滚。

所以解决方案是,在伪代码中:

 transactionManager.begin()
 doSomeJdbcStuff();
 Transaction main = transactionManager.suspend();

 // do the logging
 transactionManager.begin()  // <- now a new transaction is created and active!
 doSomeLogging();
 transactionManager.commit()

 // continue
 transactionManager.resume(main);
 doSomeMoreJdbcStuff();
 transactionManager.commit();

关于java - 混合 JTA 和 JDBC 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14056872/

相关文章:

java - Java中的文件删除和重命名

java - 如何使用 LIKE 执行好友搜索而不显示好友列表中已有的好友?

java - Hibernate setParemeter 是从 1 开始还是从 0 开始?查询参数异常

java - google app engine java jpa 一对多删除

java - 单击按钮时选择行时从多个表获取数据

java - 使用SQL存储过程我们可以得到以下输出吗?或者在代码本身中处理它?

java - 无效或损坏的 jarfile/usr/local/bin/selenium-server-standalone-2.38.0.jar

java - 适用于 Windows 的 RedHat openjdk 二进制文件可以在没有支持契约(Contract)的情况下用于生产吗?

java - 使用 OpenJPA 和 postgresql 简单创建数据库

java - Postgresql Java jdbc 通过 SSL 隧道连接到使用 .pem 文件在 Virtualbox 中运行的数据库