我一直在努力解決這個問題的日子裏,管理多個數據庫連接
下面是這種情況: 我有幾個數據庫,爲每個客戶我公司,它們都具有相同的結構 (同表和列),所以我的應用程序需要在運行時決定它需要連接哪一個。我正在使用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)的方式,仍然可以通過 傳遞數據源?
爲什麼你不能注入數據源名稱?或從屬性文件中讀取它? – 2014-09-19 01:08:31
我只是無法找到一種方法來執行此操作,並同時使用@PersistenceContext – 2014-09-19 01:15:14