我们的应用程序需要使用(只读)指向不同数据库(不同的商业供应商)的几个不同的持久性单元。
我们没有预算在其中一个上启用2pc(Sybase)。有没有办法在事务中使用它们而不必是XA事务?
我们将Hibernate Entity Manager用于Websphere 6.1,Sybase 12.5.3,Oracle 10g,Java EE 5和JPA。
更新: oracle PU每月很少更新1或2,sybase PU会经常更新 - 每天多次。隔离绝对是后者的关注点,两者之间的一致性不是强制执行的。
答案 0 :(得分:3)
小心。
只读并不总是意味着2PC不适用。如果您有两个数据库,并且只读取了两个数据库,那么您需要一个事务来保证一致的结果。假设您有一个读取数据库A的场景,然后使用这些结果来读取和更新数据库B.如果您未能使用数据库A的事务,那么当您的操作处于活动状态时,您可能已从中读取数据数据库A可以由另一个应用程序读取和更新。在这种情况下,您可以在数据库B中获得不一致的数据。
如果您确实正在阅读BOTH数据库并且两者都没有更新,那么您可能会认为分布式事务及其附带的锁定是不必要的。再一次,也许不是。如果其他应用程序正在更新相同的数据库,您也可能在此方案中获得不一致的读取。这取决于您的要求和数据库的其他用户。
我建议reading up on isolation levels深入了解即使在读取操作期间对所有持久存储(如数据库)应用的锁定。交易锁定可能是不必要的;例如,如果您处理的数据实际上没有变化(任何应用程序没有写入),则没有必要。
也许这里有一个业务解决方案 - 与您的供应商协商以降低XA支持的价格,并支付它。随着经济的发展,您可能会得到一笔可以承受的交易。旁注:我很惊讶你可以许可数据库而不是获得交易。我不知道以这种方式许可Sybase是可能的。
答案 1 :(得分:1)
Atomikos TransactionsEssentials是一个免费的开源JTA / XA,带有JDBC(和JMS)连接池。
它的一个功能是增加了对非xa数据源的支持。如果只读(您的情况),使用我们的非xa数据源安全且易于将Sybase包含在JTA事务中。
最佳盖