2014-09-19 136 views
2

我一直在努力解決這個問題的日子裏,管理多個數據庫連接

下面是這種情況: 我有幾個數據庫,爲每個客戶我公司,它們都具有相同的結構 (同表和列),所以我的應用程序需要在運行時決定它需要連接哪一個。我正在使用JPA2,EclipseLink和EJB3。

我的第一次嘗試是實現一個自定義EntityManager的所有邏輯來執行正確的數據庫上的操作,然後我配置這個EntityManager作爲一個無狀態EBJ爲了使它有可能注入它@EBJ註釋(如鏈接所述:http://www.hostettler.net/blog/2012/11/20/multi-tenancy/)。我並沒有讓它工作,因爲它在試圖注入EntityManager時拋出異常。

所以我決定到別的試一下,我創建的EntityManagerFactory和我通過 JTA_DATASOURCE它(決定在運行時使用哪一個之後),因此它可以連接到 正確的數據庫。

下面是代碼:

@Stateless 
@TransactionManagement(TransactionManagementType.CONTAINER) 
public class TestEntDAO { 

    private EntityManager em; 
    private EntityManagerFactory emf; 

    @PostConstruct 
    public void init() { 
     em = getEntityManager(); 
    } 

    public EntityManager getEntityManager() { 
     Map props = new HashMap(); 
     props.put(PersistenceUnitProperties.TRANSACTION_TYPE, "JTA"); 
     props.put(PersistenceUnitProperties.JTA_DATASOURCE, dataSourceName()); 
     emf = Persistence.createEntityManagerFactory("testePU", props); 
     em = emf.createEntityManager(); 
     return em; 
    } 

    public String dataSourceName(){ 
     if(someCondition){ 
      return "db1"; 
     }else{ 
      return "db2"; 
     } 
    } 
} 

這工作完全,唯一的問題是,該交易不被 容器管理的,所以我必須明確地標記事務的邊界(調用begin()和 commit())。我可以使用@PersistenceContext註釋使其工作,但是我不會讓EntityManagerFactory傳遞數據源。

有誰知道使用容器管理事務(CMT)的方式,仍然可以通過 傳遞數據源?

+0

爲什麼你不能注入數據源名稱?或從屬性文件中讀取它? – 2014-09-19 01:08:31

+0

我只是無法找到一種方法來執行此操作,並同時使用@PersistenceContext – 2014-09-19 01:15:14

回答

0

也許試着定義3個數據源和3個持久性單元。

<persistence-unit name="PU1"> 
    <jta-data-source>jdbc/DS1</jta-data-source> 
    ... 
</persistence-unit> 
<persistence-unit name="PU2"> 
    <jta-data-source>jdbc/DS2</jta-data-source> 
    ... 
</persistence-unit> 
<persistence-unit name="PU3"> 
    <jta-data-source>jdbc/DS3</jta-data-source> 
    ... 
</persistence-unit> 

並從任何你想要的持久性單位注入實體管理器。

@PersistenceContext(unitName = "PU2") 
EntityManager em; 

這應該有效,雖然我沒有測試它。

+0

我已經試過了,它工作正常,但是如果其中一個連接失敗,應用程序將無法部署。 – 2014-09-19 12:49:26

+0

也許它可以克服。你有什麼樣的錯誤? – zbig 2014-09-19 12:52:24

+0

就像這樣 - >內部異常:java.sql.SQLException:分配連接時出錯。原因:無法分配連接,因爲:連接嘗試失敗。 – 2014-09-19 13:04:12