JMS 与 Hibernate 会话

JMS vs Hibernate Session

我的项目使用休眠连接到数据库,从 JBoss 上的连接池获取连接。我想用队列中的 publish/consume 替换一些 reads/writes 到表。我构建了一个使用 OracleAQ 的工作示例,但是,我正在使用以下方式连接到数据库:

AQjmsFactory.getQueueConnectionFactory 后跟 createQueueConnection, 然后使用 createQueueSession 得到一个 (JMS) QueueSession 我可以在上面调用 createProducercreateConsumer.

所以我知道如何使用 jms.QueueSession 做我想做的事。但是使用休眠,我得到一个 hibernate.session,它没有那些方法。

我不想每次在队列上执行操作时都打开一个新连接 - 这就是我现在在我的工作示例中所做的。有没有办法从 hibernate.session 执行队列操作?只有 SQL 个查询?

我认为您将 JMS(消息队列)会话与 Hibernate(数据库)会话混淆了。 Hibernate 框架与 JMS 没有任何重叠,因此不能同时使用它。

您需要 2 个不同的会话才能工作:

  1. 用于数据库工作的 Hibernate 会话 (org.hibernate.Session)
  2. JMS 会话 (javax.jms.Session) JMS/queue 工作

根据您的用例,您可能还希望 XA 事务管理器在两个会话中执行适当的两阶段提交并保持事务完整性。

我也在寻找一些 "sane" 如何使用 JMS 连接来操作数据库数据的方法。什么都没有。 Dean 是对的,您必须对同一数据使用两个不同的连接,并在它们之间分配 XA 事务。

这个解决方案打开了一个充满各种前所未见的问题的世界。在现实生活中,分布式事务真的很重要。令人惊讶的是,在某些情况下,Oracle 可以检测到两个连接指向同一个数据库,然后可以绕过两阶段提交 - 即使在使用 XA 时也是如此。