是否有人在EJB容器中使用iBATIS3作为持久性框架?我最近开始构建一个新的系统,我选择EJB3.1(EJB的版本实际上与这个问题无关)作为我的应用框架和iBATIS3(这个版本是相关的!)作为我的持久性框架。我的业务逻辑是在EJB3.1会话bean中实现的,该会话bean使用IBatis3进行数据访问。我在用玻璃鱼v3)
我对这个堆栈的问题是事务管理。我通过编写一些简单的集成代码解决了我的问题,但我对此并不感到惊讶。所以我决定把这个贴出来,看看其他人是否遇到过这个问题,如果是的话,他们是如何解决这个问题的。
我的要求是IBatis3在会话bean方法中透明地使用EJB事务(通常是声明性定义的)。iBATIS3提供了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()时的连接。
我怀疑其他人也遇到过这个问题,你是怎么解决的?