日期:2014-05-20  浏览次数:20775 次

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差点搞死了:)