Java 一个事务中是否可以使用多个持久性单元,而不使用XA?

Java 一个事务中是否可以使用多个持久性单元,而不使用XA?,java,hibernate,jpa,transactions,jta,Java,Hibernate,Jpa,Transactions,Jta,我们的应用程序需要使用(只读)两个不同的持久化单元,它们指向不同的数据库(不同的,商业供应商也是如此) 我们没有预算在其中一个(Sybase)上启用2pc。有没有一种方法可以在事务中使用它们而不必是XA事务 我们在Hibernate实体管理器中使用WebSphere6.1、Sybase 12.5.3、Oracle10g、JavaEE5和JPA 更新:oracle PU很少每月更新1或2次,sybase PU更新非常频繁,每天更新多次。隔离无疑是后者的一个问题,两者之间的一致性不需要强制执行。小心

我们的应用程序需要使用(只读)两个不同的持久化单元,它们指向不同的数据库(不同的,商业供应商也是如此)

我们没有预算在其中一个(Sybase)上启用2pc。有没有一种方法可以在事务中使用它们而不必是XA事务

我们在Hibernate实体管理器中使用WebSphere6.1、Sybase 12.5.3、Oracle10g、JavaEE5和JPA

更新:oracle PU很少每月更新1或2次,sybase PU更新非常频繁,每天更新多次。隔离无疑是后者的一个问题,两者之间的一致性不需要强制执行。

小心。
只读并不总是意味着2PC不适用。如果您有两个数据库,并且两个数据库都读取,但只更新了一个,那么您需要一个事务来保证一致的结果。假设您在某个场景中读取数据库a,然后使用这些结果来读取和更新数据库B。如果您无法使用数据库a的事务,则在您的操作处于活动状态时,您从数据库a读取的数据可能会被另一个应用程序读取和更新。在这种情况下,您可以在数据库B中获得不一致的数据

如果您真的同时读取两个数据库并且都不更新,那么您可能会再次认为分布式事务及其伴随的锁定是不必要的。再说一次,也许不是。在这种情况下,如果其他应用程序正在更新相同的数据库,也可能会得到不一致的读取。这取决于您的需求和数据库的其他用户

我建议深入了解适用于所有持久存储(如数据库)的锁定,即使在读取操作期间也是如此。事务锁定可能是不必要的;例如,如果您正在处理的数据实际上没有变化(任何应用程序都没有写入),那么这是不必要的

也许这里有一个商业解决方案——与您的供应商协商降低XA支持的价格,并支付费用。随着经济的发展,你可能会得到一笔你能负担得起的交易。旁注:我很惊讶您可以授权数据库而不获取事务。我不知道以这种方式许可Sybase是可能的

是一个免费的开源JTA/XA,带有JDBC(和JMS)连接池

它的一个特性是增加了对非xa数据源的支持。如果是只读的(您的案例),那么使用我们的非xa数据源将Sybase包含到JTA事务中是安全且容易的

最好的
盖伊

是的,你提出了非常关键的观点。我在OP中澄清了两个PUs的隔离和一致性要求。我们正在与供应商单独谈判。注意:显然数据库附带了事务,但是XA事务有一个附加的价格标签——欢迎使用sybase定价的方式。