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