2013-08-04 74 views
3

我一直在使用Java EE平臺編程一段時間,但有時我錯過了更大的圖片。單個JTA事務中的多個XA數據源

使用EJB和Container-Managed Transactions,如何在單個事務中對多個數據源執行操作?

我的代碼如下所示:

AAA級EJB模塊

包含一個persistence.xml指向第一個數據源。

@Stateless 
public class AaaDao { 
    @PersistenceContext 
    EntityManager em; 

    // using defaults: @TransactionAttribute(REQUIRED) 
    public void foo(...) { 
     em.persist(...); 
    } 
} 

BBB-EJB模塊

包含另一個persistence.xml(一個不同的持久性單元)指向所述第二數據源。

@Stateless 
public class BbbDao { 
    @PersistenceContext 
    EntityManager em; 

    // using defaults: @TransactionAttribute(REQUIRED) 
    public void bar(...) { 
     em.persist(...); 
    } 
} 

CCC-EJB模塊

取決於上述兩個模塊。

@Stateless 
public class CccBean { 
    @EJB AaaDao aaaDao; 
    @EJB BbbDao bbbDao; 

    // using defaults: @TransactionAttribute(REQUIRED) 
    public void qux(...) { 
     aaaDao.foo(...); 
     bbbDao.bar(...); 
    } 
} 

我的意思是:真的那麼容易嗎?當事情似乎「神奇地」起作用時,我總是有點懷疑,我總是懷疑有一個「捕捉」。

在Oracle WebLogic 10.3上使用Java EE 5,EJB 3.0和JPA 1.0。

回答

1

是的,這真的很容易。 CccBean.qux開始新的XA交易,呼叫者以AaaDao/BbbDao重複使用同一交易(因爲您指出REQUIRED)。 EntityManager使用DataSourceDataSourceenlistResourceXAResource與交易。當C​​退出時,事務將被提交,事務管理器將在數據源註冊的XAResource上驅動兩階段提交。