Transactions EJB(3.1)容器中iBATIS3中的事务管理

Transactions EJB(3.1)容器中iBATIS3中的事务管理,transactions,ejb-3.0,ibatis,Transactions,Ejb 3.0,Ibatis,有人在EJB容器中使用iBATIS3作为持久性框架吗?我最近开始构建一个新系统,我选择EJB3.1(EJB的版本实际上与这个问题无关)作为我的应用程序框架,iBATIS3(这个版本与此相关!)作为我的持久性框架。我的业务逻辑在EJB3.1会话bean中实现,该会话bean使用iBATIS3进行数据访问。我在玻璃鱼上跑步(v3) 我对这个堆栈的问题是事务管理。我已经通过编写一些简单的集成代码解决了我的问题,但我对不得不这么做并不感到惊讶。所以我决定发布这篇文章,看看其他人是否遇到过这种情况,如果是

有人在EJB容器中使用iBATIS3作为持久性框架吗?我最近开始构建一个新系统,我选择EJB3.1(EJB的版本实际上与这个问题无关)作为我的应用程序框架,iBATIS3(这个版本与此相关!)作为我的持久性框架。我的业务逻辑在EJB3.1会话bean中实现,该会话bean使用iBATIS3进行数据访问。我在玻璃鱼上跑步(v3)

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

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


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

这个问题最终在这里得到了讨论/解决: