实现自定义JTA XAResource以便与hibernate一起使用

时间:2010-04-16 03:33:38

标签: java transactions jta

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

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

2 个答案:

答案 0 :(得分:1)

  

我想让两个级别在事务中起作用。

然后你必须更改InnoDB的存储引擎,MyISAM表不支持事务(从技术上讲,你不会收到错误,但回滚不会回滚任何东西)。

  

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

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

但说实话,你应该真正澄清你的要求。可能还有其他(更简单)选项而不是使用XA。如果以上所有听起来像中文,那么我觉得不使用XA 会是一个很好的建议。

答案 1 :(得分:1)

通过DataSource获取连接,该数据源可以配置为支持分布式事务。要在分布式事务中使用多个连接,必须配置多个DataSource以支持XA并返回XA连接。

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

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

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

您可以在大多数情况下使用特定于实现的API获取EntityManager使用的基础连接(至少可以使用Hibernate)。这意味着您可以在不使用JTA和XA的情况下满足您的要求:使用EntityManager的基础连接来处理您的JDBC。

总结:

  1. 无需乱用XAResource
  2. 切换到InnoDB
  3. 您可以尝试切换到XA数据源并获取与DataSource.getConnection()
  4. 的连接
  5. 您可以尝试切换到XA数据源并获取基础EntityManager连接
  6. 您可以尝试使用非XA数据源并获取基础EntityManager连接
  7. 希望我理解你的问题并且有所帮助。