多个持久化单元的持久化配置文件 persistence.xml

11
我尝试将同一实体持久化到MySQL和Postgres数据库中(这主要是为了识别任何不一致之处,并解决双重写入时的任何问题细节 - 我在这里遇到了问题)。我找到的文章都描述了依赖于其他框架的解决方案。我正在尝试使用Glassfish 4.0开箱即用、JPA 2.1和EclipseLink 2.5作为JPA提供程序来解决这个问题。我使用Eclipse,并意识到IDE不支持在persistence.xml文件中配置多个持久性单元,因此我直接编写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>短语(不管是哪一个),实体将被持久化到相关的数据库中——我只是无法想出如何同时使用两者(而不依赖于其他框架的持久化功能)。

1个回答

16
成功了;需要做几件事情。似乎这个方法使用多个数据库的关键部分是,连接池类型必须设置为使用分布式事务。由于这本质上是一个实验,两个DB不一定需要在同一事务中持续,但它也不会有问题。(这篇文章有助于识别错误消息中的问题)(这里)。还需要按照这里中描述的更改Postgres参数,以启用准备事务。

以下步骤使一切都开始了:

(1) 在Glassfish中:
在JDBC连接池中,将两个db的资源类型更改为javax.sql.XADataSource。将Postgres的数据源类名称更改为org.postgresql.xa.PGXADataSource; 将MySQL的数据源类名称更改为com.mysql.jdbc.jdbc2.optional.MysqlXADataSource

(2) 在Posgres配置(postgresql.config)中:
启用max_prepared_transactions并将其设置为比max_connections多1。(我必须调整这两个参数来找到不会爆出所有可用共享内存的参数;但由于这只是一个实验,减少db连接数与增加共享内存之间的权衡是可以接受的)

(3) 在代码中:
@PersistenceContext(name="...")更改为@PersistenceContext(unitName="...")


关于这个“答案”的警告 - 大部分内容对我来说都是新的,因此这可能不是处理它的最优雅方法。如果有人能提供一个解决此问题的“最佳实践”,我会非常感兴趣。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接