4

有人在 EJB 容器中使用 iBATIS 3 作为他们的持久性框架吗?我最近开始构建一个新系统,我选择 EJB 3.1(EJB 的版本实际上与这个问题无关)作为我的应用程序框架和 iBATIS 3(这个版本是相关的!)作为我的持久性框架。我的业务逻辑是在使用 iBATIS 3 进行数据访问的 EJB 3.1 会话 bean 中实现的。我在 GlassFish v3 上运行)

我对这个堆栈的问题是事务管理。我已经通过编写一些简单的集成代码解决了我的问题,但我对我不得不这样做并不感到惊讶。所以我决定发布这个来看看其他人是否遇到过这个问题,如果是的话,他们是如何解决这个问题的。

我的要求是 iBATIS 3 在会话 bean 方法中透明地使用 EJB 事务(通常以声明方式定义)。iBATIS 3 提供了 2 个事务工厂 JdbcTransactionFactory 和 ManagedTransactionFactory,我发现这两个工厂在 EJB 环境中都不能正常工作(查看 iBATIS 源代码很清楚为什么它会失败)。

JdbcTransactionFactory 不合适,因为我希望忽略对 sqlSession.commit() 或 sqlSession.rollback() 的任何调用。所以我认为我应该使用 ManagedTransactionFactory,因为它确实会导致对 sqlSession.commit() 或 sqlSession.rollback() 的任何调用被忽略,但它也会导致 sqlSession.close()无法关闭 iBATIS 从sqlSession.open() 中的DataSource(DataSource 是我提供给iBATIS 的一个容器管理的DataSource 对象)。这会导致 GlassFish 耗尽其连接池并且应用程序失败。

所以我写了一个新的 TransactionFactory 实现,EJBTransactionFactory,它导致 sqlSession.commit() 或 sqlSession.rollback() 什么都不做,但在调用 sqlSession.close() 时会关闭连接。

我怀疑其他人遇到了这个问题,你是怎么解决的?

4

1 回答 1

2

这最终在这里得到讨论/解决:http: //www.mail-archive.com/user-java@ibatis.apache.org/msg16138.html

于 2010-08-10T05:32:35.380 回答