我有两个级别的数据库访问权限:第一个使用Hibernate,第二个使用JDBC。 JDBC级别适用于非事务性表(我使用MyISAM来提高速度)。我想让两个级别在事务中起作用。我读到了可以管理分布式事务的JTA。但互联网上缺乏关于如何实现和使用自定义资源的信息。
是否有人有使用自定义XAResources的经验?
答案 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。
总结:
DataSource.getConnection()
EntityManager
连接EntityManager
连接希望我理解你的问题并且有所帮助。