有人在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()中的数据源(数据源是我提供给iBATIS的容器管理的数据源对象)。这将导致GlassFish耗尽其连接池,并且应用程序将失败。

因此,我编写了一个新的TransactionFactory实现EJBTransactionFactory,它使sqlSession.commit()或sqlSession.rollback()什么都不做,但是在调用sqlSession.close()时确实关闭了连接。

我怀疑其他人遇到了这个问题,您是如何解决的?

最佳答案

最终在这里得到讨论/解决:http://www.mail-archive.com/[email protected]/msg16138.html

关于transactions - EJB(3.1)容器内的iBATIS 3中的事务管理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2663714/

10-12 14:22