2011-08-20 58 views
0

讓我們考慮一個表有一個主數據庫。使用Jboss動態加載DataSource裏面的EJB項目

我在jboss的deploy目錄下創建了一個datasource xml文件,並將其放入ejb項目中,放入persistance.xml數據源中。

在我的ejb項目裏面,我使用@PersistenceContext並將這個表加載到實體管理器中。在表內部有一些數據源名稱(數據源名稱是jndi數據源名稱?)我也是在deploy目錄中創建的。加載其他數據源名稱的這個bean現在調用其他ejbs並將它們中的一個數據源名稱從表中傳遞給它們。

此其他ejb現在應該使用給定的數據源名稱而不是persistence.xml內部連接到該數據庫。

換句話說:我想加載一個ejb中的數據源名稱。然後我想調用其他ejbs,每個ejb應該連接到不同的數據源。

非常感謝, Hauke

回答

2

我不太清楚你在這裏後什麼,所以謹慎的一個詞是聽起來就像你試圖做一些事情一丁點兒的瘋狂(JPA的沒有按在運行時不喜歡動態)。

但是,有幾個選擇:我聽到的是你想改變連接到數據庫。首先,您的持久性XML只是一個起點,您不必包含數據源。這不是最好的做法,因爲DataSource和datasourse-ds.xml的想法是確保您可以配置應用程序而無需重新編譯代碼(以及多個部署等)。如果您接管管理連接的工作,則可以使用實體管理器。

我只是想澄清這可能是一個壞主意(你在談論一個ORM框架--JPA Hibernate在這種情況下),而不是使用@PersistenceContext,你可以提供你自己的實體管理器。我強烈建議考慮使用EclipseLink作爲解決方法。它不像JBoss那樣嵌入,你可以(一旦運行)從頭開始配置它。

http://wiki.eclipse.org/EclipseLink

一旦你擁有了它運行,就可以積極地創建和銷燬的實體管理器,或者您從一個連接的屬性創建大量的實體管理器。

這裏的長短:我想你會走上一條非常糟糕的道路,你可能想重新考慮設計。 JPA可能是錯誤的工具,儘管我討厭這麼說,但如果您經常更改連接,那麼您最好使用javax.sql比使用JPA數據源更好。

總之,使用Eclipselink2.X你可以不喜歡下面 - >

HashMap<String, Object> connectionA new = HashMap<String, Object>(); 
propsA.put("javax.persistence.jdbc.driver", "driverClass"); 
propsA.put("javax.persistence.jdbc.url", "connectionString"); 
. . . 
etc... 
EntityManager entityManager = Persistence.createEntityManagerFactory("myUnit"). 
createEntityManager(propsA); 

此時您可以創建一組新的屬性(有一個新的連接支持它)每次需要經理。

噩夢?是。容器管理?不 - 你會負責處理交易,但是它應該工作嗎?絕對。

+0

+1最後的評論。這很容易成爲一場噩夢。請注意,Hibernate通常支持類似的東西,但Daniel在配置中確實沒有提及它,因爲它隨JBoss AS提供。 –