【问题标题】:How to get EntityManager(s) for mulitple persistence units如何为多个持久性单元获取 EntityManager(s)
【发布时间】:2016-10-25 01:56:16
【问题描述】:

我正在编写一个在 WebSphere Liberty Profile 8.5.5 中运行的 JEE7 应用程序。我们正在使用 JPA(通过 WLP 中的 Eclipselink 实现)。

我在同一个“persistence.xml”文件中有多个持久性单元。我还需要访问同一个班级中的两个单元。

我在尝试使用第二个 EntityManager 时遇到运行时错误:

@PersistenceContext(unitName = "wwer-list")
private EntityManager entityManagerWwerList;
@PersistenceContext(unitName = "main-dashboard")
private EntityManager entityManagerMainDashboard;

E WTRN0062E: An illegal attempt to use multiple resources that have only one-phase capability has occurred within a global transaction.  

如何摆脱这个错误?

另外,我使用的所有表格仅用于阅读。那么如何指定我只想要 JPA 的只读访问权限?

【问题讨论】:

  • 我从错误消息中得到了这个。 www-01.ibm.com/support/docview.wss?uid=swg21247192。我的理解是,您需要分布式事务才能跨两个持久单元工作。您可能必须使用 Bitronix 事务管理器之类的东西来实现这一目标
  • 你的 persistence.xml 是什么样的?
  • jdbc/wwer-listcom.ibm.youribm.services .expensesaggregator.ejb.dao.jpa.entity.WwerEntityjdbc/main-dashboard数据源> com.ibm.youribm.services.expensesaggregator.ejb.dao.jpa.entity.DashboardEntity ...
  • 抱歉,我一直无法正确格式化 cmets。

标签: java jpa websphere-liberty


【解决方案1】:

提示此问题是因为您的一个数据源使用 ConnectionPoolDataSource 配置为(单阶段提交),而另一个数据源配置为 XADataSource。

如果您想继续使用相同的数据源配置,则必须将您的服务器配置更新为“接受启发式危险”。

在管理控制台中,单击 EAR,选中复选框“Accept heuristic hazard”。重新启动服务器。

启用最后参与者支持的此链接也可能会有所帮助。 http://www.ibm.com/support/knowledgecenter/SSAW57_7.0.0/com.ibm.websphere.nd.doc/info/ae/webui_pme/ui/ueac_laoextensionsettings.html

【讨论】:

  • 谢谢。但是我没有故意配置 XADataSource,我没有在任何地方设置它。我只需要读取数据源,不会有更新。
【解决方案2】:

如果没有您的 persistence.xml 和 server.xml 配置,我无法确定,但看起来支持您的 <persistence-unit> 配置的 <dataSource> 元素不支持 XA。​​

默认情况下,<dataSource> 应该是 javax.sql.XADataSource(因此支持 XA),但是如果您使用不提供 XADataSource 实现的 JDBC 驱动程序,Liberty 将选择更简单的 DataSource 实现(即@987654325 @ 或纯 javax.sql.DataSource)。

每当您发出 UserTransaction.begin() 时,就会发生全局事务,并一直持续到您发出 commit()rollback() 为止。您还可以通过其他方式参与全球事务。

由于您想要只读访问权限,将您的 DataSources 转换为 XA 可能会有点过头了。相反,尝试从等式中消除全局事务。如果无法消除全局事务,可以在 server.xml 中指定 XADataSource,如下所示:

<dataSource type="javax.sql.XADataSource" ...>
    <jdbcDriver .../>
    <properties .../>
</dataSource>

【讨论】:

  • 我没有使用全局事务,或者至少不是故意的。这纯粹是一个只读服务。那么如何摆脱全局事务呢? XA 听起来确实有点矫枉过正,在我看来它也会减慢速度。
猜你喜欢
  • 1970-01-01
  • 2012-11-09
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 2013-08-18
相关资源
最近更新 更多