【问题标题】:Implement custom JTA XAResource for using with hibernate实现自定义 JTA XAResource 以与 hibernate 一起使用
【发布时间】:2011-02-08 16:11:34
【问题描述】:

我对数据库有两个级别的访问权限:第一个使用 Hibernate,第二个使用 JDBC。 JDBC 级别使用非事务性表(我使用 MyISAM 以提高速度)。我想让这两个级别都在事务中工作。我读到了可以管理分布式事务的 JTA。但是互联网上缺乏关于如何实现和使用自定义资源的信息。

有人有使用自定义 XAResources 的经验吗?

【问题讨论】:

    标签: java transactions jta


    【解决方案1】:

    我想让这两个级别都在事务中工作。

    那么你将不得不为 InnoDB 更改存储引擎,MyISAM 表不支持事务(从技术上讲,你不会收到错误,但回滚不会回滚任何东西)。

    有人有使用自定义 XAResources 的经验吗?

    我不确定你在说什么。我在这里看到的唯一 XA 资源是您的数据库,您不需要实现任何自定义。您需要做的是使用很可能从两个 XA 数据源(MySQL Connector/J 5.0.0+ 支持)获得的 XA 连接,使用 JTA API 并让事务管理器完成它的工作。

    但老实说,您应该真正阐明您的要求。除了使用 XA 之外,可能还有其他(更简单的)选项。如果以上所有内容听起来都像中文,那么我觉得不要使用XA在这里会是一个很好的建议。

    【讨论】:

      【解决方案2】:

      连接是通过 DataSource 获得的,该 DataSource 可以配置为支持或不支持分布式事务。要在分布式事务中使用多个连接,您必须配置多个 DataSource 以支持 XA 并返回 XA 连接。

      也就是说,只有当您连接到 不同 数据库时,您才需要多个物理连接,这似乎不是您的情况(问题中并不清楚)。

      只要您在同一个线程中,DataSource 就可以足够聪明地确保使用相同的物理连接;每次请求连接时,它实际上都会向同一个物理连接返回一个“句柄”,并且当所有句柄都关闭时,物理连接会返回到池中。 (但这取决于 DataSource 的实现)。

      Hibernate 本身 不是 XA 资源:它使用通过 DataSource 获得的底层连接。但它通过 JTA 将自身挂接到事务管理器中,特别是在分布式事务提交之前刷新所有挂起的更改。

      大多数时候,您可以使用特定于实现的 API 获取 EntityManager 使用的底层连接(至少在 Hibernate 中是可能的)。这意味着您可以完全不使用 JTA 和 XA 来满足您的要求:为您的 JDBC 内容使用 EntityManager 的底层连接。

      总结:

      1. 无需乱用 XAResource
      2. 切换到 InnoDB
      3. 您可以尝试切换到 XA 数据源并获取与DataSource.getConnection() 的连接
      4. 您可以尝试切换到XA DataSource并获取底层EntityManager连接
      5. 您可以尝试坚持使用非 XA 数据源并获取底层 EntityManager 连接

      希望我正确理解了您的问题,希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-30
        • 1970-01-01
        • 1970-01-01
        • 2013-06-13
        • 1970-01-01
        • 1970-01-01
        • 2012-01-27
        相关资源
        最近更新 更多