Hibernate 中的事务管理问题
在网上有很多人谈到hibernate关闭session情况。在HibernateSessionFactory使用了ThreadLocal。有些网友说在DAO中无需关闭session,如下:
public boolean save(Printers transientInstance) {
log.debug( "saving Printers instance ");
try {
// 开始事务
Transaction tran = getSession().beginTransaction() ;
// 执行语句
getSession().save(transientInstance);
// 提交事务
tran.commit();
log.debug( "save successful ");
return true;
}
catch (
RuntimeException re) {
log.error( "save failed ", re);
System.out.println( "Error: "+re.getMessage());
return false;
}
}
但有些文章说如果不关闭session会造成不好影响,应该打开Session,但操作执行完毕后要关闭Session,如下:
public boolean save(Printers transientInstance) {
log.debug( "saving Printers instance ");
Transaction tran=null;
try {
// 开始事务
tran = getSession().beginTransaction() ;
// 执行语句
getSession().save(transientInstance);
// 提交事务
tran.commit();
log.debug( "save successful ");
return true;
} catch (RuntimeException re) {
log.error( "save failed ", re);
//设置回滚
if(tran!=null)
tran.rollback();
System.out.println( "Error: "+re.getMessage());
return false;
}
finally{
closeSession();
}
}
请问哪种合理?在使用ThreadLocal后是不是可以不关闭Session?
------解决方案--------------------最好不要关闭
如果关闭了
像lazy-loading等特性就没法使用了
所以可以使用threadlocal的方法。
对于web应用
可以看看spring的open session to view方法。
前段时间被这个session差点搞死了:)