2010-04-18 73 views
4

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

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

我的要求是让IBBATIS 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()被调用的连接。

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

回答