【问题标题】:EJB and container getting different database connections under GlassfishGlassfish 下 EJB 和容器获取不同的数据库连接
【发布时间】:2014-12-17 17:47:12
【问题描述】:

我有一个关于 EJB 及其在 Glassfish 下使用数据库连接的问题,我不明白为什么我找不到很多其他人遇到同样的问题,但我的所有搜索都证明是徒劳的。我认为这更像是 Glassfish 而不是 Hibernate 问题,但希望有人可以在这里提出建议。

我有一个相对简单的设置,它是一个基于 Hibernate 的应用程序,使用 CMT 部署在 Glassfish 下。我有几个途径进入这个应用程序,GUI 和 WS,它们都通过 EJB 调用进入。为了便于在单个事务中运行多个 EJB,我在 Glassfish 连接池中设置了一个 Oracle XADataSource。这一切都很好,除了我注意到一件事给我们带来了问题。问题是任何通过 EJB 进行的数据库交互始终与相同的底层连接进行交互(这很好),但是一旦容器接管提交,它就会始终接收不同的连接。任何 EJB 工作结束时的刷新可以避免任何问题,但如果任何工作在 EJB 完成时未刷新,而是由最终提交处理,现在这会在不同的(隔离的)连接下发生。

在我看来,容器希望与事务的其余部分建立不同的连接,这似乎很奇怪,但是在 Glassfish 代码中进行了调试后,它似乎非常有目的地表现得像这样。在提交时,EJB 正在使用的连接被标记为忙,并且作为空闲资源不可用。本轮的分配与事务无关,因此只是寻找一个空闲资源,这将是一个不同的连接。

这对我们来说有点问题,因为我们正在构建一个无法保证 EJB 方法中的最后一次调用将是刷新的框架。

如果有人能告诉我这里发生了什么,我将不胜感激。我真的不明白为什么这对更多人来说不是一个问题。谢谢

使用 Glassfish 3.1.1、Hibernate 3.5.6、Oracle 驱动程序 ojdbc6.jar 和 javax.sql.XADataSource

【问题讨论】:

    标签: hibernate jakarta-ee glassfish ejb xa


    【解决方案1】:

    在对 Glassfish 源代码进行大量调试之后,我现在对这一点有了更好的理解。 Glassfish 中有一个选项可确保向 CMT 提交发出的连接与整个事务中使用的连接相同。此设置位于连接属性的高级选项卡中,称为“允许非组件调用者”。 http://docs.oracle.com/cd/E26576_01/doc.312/e24930/jdbc.htm#gavro 此处的文档建议第三方持久性管理器需要这样做,以便“返回的连接自动与从事务管理器获得的事务上下文一起登记”。

    我发现这一点的原因是,我将另一个基于 Hibernate 的 web 应用程序部署到 Glassfish,但设置要简单得多,这次行为不同,我可以看到数据源名称已自动添加了 __pm 后缀,这是相同的启用“允许非组件调用者”。唯一对我来说仍然是个谜的是,为什么我拥有的一个 webapp 会自动触发此行为,而另一个则不会。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-14
      • 2014-05-19
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多