我对数据库有两级访问权限:第一个使用 Hibernate,第二个使用 JDBC。JDBC 级别适用于非事务性表(我使用 MyISAM 以提高速度)。我想让这两个级别都在事务中工作。我读到了可以管理分布式事务的 JTA。但是互联网上缺乏关于如何实现和使用自定义资源的信息。
有没有人有使用自定义 XAResources 的经验?
我对数据库有两级访问权限:第一个使用 Hibernate,第二个使用 JDBC。JDBC 级别适用于非事务性表(我使用 MyISAM 以提高速度)。我想让这两个级别都在事务中工作。我读到了可以管理分布式事务的 JTA。但是互联网上缺乏关于如何实现和使用自定义资源的信息。
有没有人有使用自定义 XAResources 的经验?
连接是通过可以配置为支持或不支持分布式事务的 DataSource 获得的。要在分布式事务中使用多个连接,您必须配置多个 DataSource 以支持 XA 并返回 XA 连接。
也就是说,只有当您连接到不同的数据库时,您才需要多个物理连接,这似乎不是您的情况(问题中并不清楚)。
只要您在同一个线程中,DataSource 就可以足够聪明地确保使用相同的物理连接;每次请求连接时,它实际上都会向同一个物理连接返回一个“句柄”,并且当所有句柄都关闭时,物理连接会返回到池中。(但这取决于 DataSource 的实现)。
Hibernate本身不是 XA 资源:它使用通过 DataSource 获得的底层连接。但它通过 JTA 将自身挂接到事务管理器中,特别是在分布式事务提交之前刷新所有挂起的更改。
大多数情况下,您可以获取使用实现特定 API 使用的底层连接EntityManager
(至少在 Hibernate 中是可能的)。这意味着您可以完全不使用 JTA 和 XA 来满足您的要求:使用EntityManager
JDBC 的底层连接。
总之:
DataSource.getConnection()
EntityManager
连接EntityManager
连接希望我正确理解了您的问题,并且对您有所帮助。
我想让这两个级别都在事务中工作。
然后您必须更改 InnoDB 的存储引擎,MyISAM 表不支持事务(从技术上讲,您不会收到错误,但回滚不会回滚任何内容)。
有没有人有使用自定义 XAResources 的经验?
我不确定你在说什么。我在这里看到的唯一 XA 资源是您的数据库,您不需要实现任何自定义。您需要做的是使用很可能从两个 XA 数据源(MySQL 连接器/J 5.0.0+ 支持)获得的 XA 连接,使用 JTA API 并让事务管理器完成它的工作。
但老实说,你应该真正澄清你的要求。除了使用 XA 之外,可能还有其他(更简单的)选项。如果以上所有内容听起来都像中文,那么我觉得这里不使用 XA会是一个很好的建议。