2013-08-16 92 views
11

我試圖堅持同一個實體到MySQL和Postgres數據庫(這主要是爲了找出任何不一致,並找出任何問題的細節做雙寫 - 這我跑到這裏了)。我發現的文章都描述了依賴於其他框架的解決方案。我試圖用GlassFish 4.0開箱即用,JPA 2.1和EclipseLink 2.5作爲JPA提供商來解決這個問題。我使用的是Eclipse,並且意識到IDE不支持在persistence.xml文件中配置多個持久性單元,所以我正在爲此直接編寫XML。persistence.xml爲多個持久性單元

我期待這樣做的代碼(在相同的方法):

@PersistenceContext(name = "MyAppMySQLPU") 
EntityManager emMySQL; 
@PersistenceContext(name = "MyAppPostgresPU") 
EntityManager emPostgres; 
//...etc... 
MyThing thing = new MyThing(); 
//...etc... 
emMySQL.persist(thing); 
emPostgres.persist(thing); 

,並使用persistence.xml文件,其中包含此:

<persistence-unit name="MyAppPostgresPU"> 
    <jta-data-source>jdbc/PostgresPool_test</jta-data-source> 
    <class>model.MyThing</class> 
    </persistence-unit> 

    <persistence-unit name="MyAppMySQLPU"> 
    <jta-data-source>jdbc/MySQLPool_test</jta-data-source> 
    <class>model.MyThing</class> 
    </persistence-unit> 

當我這樣做,我得到以下錯誤:

SEVERE: Exception while invoking class org.glassfish.persistence.jpa.JPADeployer prepare method 
SEVERE: Exception while preparing the app 
SEVERE: Exception while preparing the app : Could not resolve a persistence unit corresponding to the persistence-context-ref-name [MyAppPostgresPU] in the scope of the module called [MyApp]. Please verify your application. 

但是,如果我只包含一個<persistence-unit>個短語(與哪一個無關),實體被持久化到關聯的數據庫 - 我無法弄清楚如何讓它與兩者同時工作(沒有利用其他框架中的持久性功能)。

回答

15

明白了;有幾件事情必須完成。這似乎是其中一個關鍵部分,爲了使用多個數據庫和我採用的方法,需要將連接池類型設置爲使用分佈式事務。由於這本質上是一個實驗,所以兩個數據庫都沒有需要處於同一個事務中,但這不是問題。 (This文章有助於從錯誤消息中識別該文章)。還需要按照here所述更改Postgres參數,以啓用準備好的事務。


這讓這一切會:

(1)在Glassfish的:
在JDBC連接池,兩個數據庫的更改的資源類型javax.sql.XADataSource。將Postgres的數據源類名更改爲org.postgresql.xa.PGXADataSource;將MySQL的數據源類名更改爲com.mysql.jdbc.jdbc2.optional.MysqlXADataSource

(2)在Posgres配置(postgresql.config):
啓用max_prepared_transactions,並將其設置爲大於1 max_connections更大。 (我必須使用這兩個參數來找到一些沒有吹出所有可用共享內存的東西;但是由於這只是一個實驗,所以db連接數量與增加的共享內存相比是減少的)

(3)在代碼:
更改@PersistenceContext(name="...")@PersistenceContext(unitName="...")


買者對這個「答案」 - 這其中大部分是新的我,所以這可能不是來處理這最優雅的方式。如果任何人都可以提供一個「最佳實踐」來解決這個問題,我會很感興趣知道。

相關問題