iBATIS 3中的事务管理在EJB(3.1)容器中

时间:2010-04-18 19:55:10

标签: transactions ejb-3.0 ibatis

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

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

我的要求是iBATIS 3在会话bean方法中透明地使用EJB事务(通常以声明方式定义)。 iBATIS 3提供了两个事务工厂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()时关闭连接

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

1 个答案:

答案 0 :(得分:2)