gpt4 book ai didi

jpa - 多个持久化单元的persistence.xml

转载 作者:行者123 更新时间:2023-12-04 01:54:28 26 4
gpt4 key购买 nike

我正在尝试将相同的实体保存到 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> 中的一个短语(与哪个无关紧要),实体被持久化到关联的数据库——我只是不知道如何让它同时使用这两个(不利用附加框架中的持久性功能)。

最佳答案

让它工作;必须做几件事。似乎其中的一个关键部分是,为了通过我采用的方法使用多个数据库,需要将连接池类型设置为使用分布式事务。由于这本质上是一个实验,因此两个 db persists 不需要在同一个事务中,但是这样不是问题。 ( This 文章有助于从错误消息中识别出这一点)。还需要更改 Postgres 参数,如 here 所述。 , 以启用准备好的交易。

这一切都开始了:

(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并将其设置为大于 max_connections 的 1 . (我不得不使用这两个参数来找到没有耗尽所有可用共享内存的东西;但由于这只是一个实验,减少数据库连接数与增加共享内存是可以的)

(3) 在代码中:
更改 @PersistenceContext(name="...")@PersistenceContext(unitName="...")
关于这个“答案”的警告——大部分对我来说都是新的,所以这可能不是处理这个问题的最优雅的方式。如果有人可以提供“最佳实践”来解决这个问题,我会很想知道。

关于jpa - 多个持久化单元的persistence.xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18275676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com