【发布时间】: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