目前在我的JavaEE应用程序服务器中使用本地和远程EJB,MDB(Singleton和Stateless),我正在使用JDBC-Transactions for Hibernate Core .
管理自己所有的打开和关闭,提交休眠会话和事务都可能导致连接泄漏和未经发布的事务 .
特别是在编程错误的情况下,导致自定义或未经检查的异常未被捕获并抛出到远程客户端 .
什么是最简单或最好的方法来确保我的hibernate会话被关闭并且事务回滚以防出现错误?
使用容器管理事务(CMT)还是可以关闭在返回任何EJB方法时调用的拦截器中的会话?
一种简单的方法是将会话范围的用法包装在try-catch块中并捕获任何类型的Exception,但是使用较少代码的一般方法将受到青睐 .
Edit: Remote EJB Example
我的低级Hibernate DAO会关闭连接并在抛出异常时回滚事务 . 有问题的是DAO访问之间的业务逻辑,以防连接仍然打开 . *
public void doSomething(Foo foo) throws Exception
{
// open session and transaction
Session session = DAO.openSession();
// retrieve data
Bar bar = DAO.get(session, ...)
// call other methods which throws an exception resulting in open connection
doOtherStuff(foo, bar)
DAO.save(session, foo);
// commit transaction
DAO.closeAndCommitSession(session);
}
现在我正在使用一个很大的尝试 - 最后:
public void doSomething(Foo foo) throws Exception
{
// open session and transaction
Session session = DAO.openSession();
try
{
// retrieve data
Bar bar = DAO.get(session, ...)
// call other methods which throws an exception resulting in open connection
doOtherStuff(foo, bar)
DAO.save(session, foo);
}
catch (final Exception e)
{
DAO.rollBackTransaction(session);
throw e;
}
finally
{
DAO.closeAndCommitSession(session);
}
}