MyException - 我的异常网
当前位置:我的异常网» Java Web开发 » 恳请csdn的高手们帮帮忙,Hibernate的session就是打

恳请csdn的高手们帮帮忙,Hibernate的session就是打不开?解决方法(2)

www.MyException.Cn  网友分享于:2013-12-30  浏览:44次

} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}

/**
* 得到当前进程中的session

* @return Session
*/
public static Session currentSession() {

Session s = (Session) session.get();
if (s == null || s.isOpen() == false) {
s = sessionFactory.openSession();
session.set(s);
count++;
if(count == 100000)count = 0;
}
return s;
}

------解决方案--------------------
Hibernate中发生"Session is closed" 的另一种可能:没有commit的Transaction。 
关键字:"Session is closed" Hibernate 
一般的在struts加Hibernate的项目中!大家想必都使用的HibernateUtil和CloseSessionFilter! 
也许很多人,只是对上面的两个类只是用一用,大概都没有仔细地研究过吧,我也是一样! 

在过渡器中有这样的代码! 
public void doFilter( 
ServletRequest request, 
ServletResponse response, 
FilterChain chain) 
throws IOException, ServletException
// TODO Auto-generated method stub 
try{ 
chain.doFilter((HttpServletRequest)request, (HttpServletResponse)response); 

finally{ 
try{ 
HibernateUtil.commitTransaction(); 
//System.out.println("commit ok"); 
}catch (Exception e){ 
HibernateUtil.rollbackTransaction(); 
}finally{ 
HibernateUtil.closeSession(); 
}



在项目开始前一段时期,总觉的每开一个session都要commit一次事务,有些浪费(看不惯"没有作用"的代码)!就这样把它给删了! 

在项目开发后运行中,在某个Action中下列代码处 
HibernateUtil.beginTransaction() 
//省略的代码 
//这几句是业务逻辑处理 
if(!this.checkYRGS(mcdjForm)) 

Msg.addError(request,new ActionMessage("mcdj.yrgs")); 
return mapping.getInputForward(); //这样就有了一个没有commit的Transaction! 这就是问题的根源! 

//省略的代码 
HibernateUtil.commitTransaction(); 
return mapping.getInputForward("下一个流程页面"); 

如果有一次在上面的业务逻辑处理处发生了跳转(产生没有commit的Transaction),则下一次运行到 
任何处的HibernateUtil.commitTransaction();就会发生异常:Session is closed。! 

经过很久的上网搜索和不断的测试(打印相关session和transaction的对象的hashcode), 
发现每个不同session的使用session.beginTransaction()获得的transaction对象都是一样的。 

总之session.beginTransaction()并不能保证获得的是一个全新transaction对象,也不能保证这个transaction对象与 
当前的session进行了关联! 

觖决办法: 
在filter中commitTransaction(),或在程序中commitTransaction()就行了。一定要保证transaction对象要commit; 

------解决方案--------------------
public static void closeSession() {

Session session = (Session) tLocalsess.get();


try {
if (session != null && session.isOpen()) {

session.close(); 
tLocalsess.set(session);

}
} catch (HibernateException e) {
tLocalsess.set(null);
e.printStackTrace();

//throw new HibernateException(e);
}
}

试试仅供参考
------解决方案--------------------
从现在的代码看,Transaction 和 Session 不能完全匹配。 
public static final ThreadLocal tLocalsess = new ThreadLocal();
public static final ThreadLocal tLocaltx = new ThreadLocal();

为什么需要两个container分别存储Session,Transaction?
另外,作为web应用,我们要用hibernate的连接池功能,sessionFactory就是这个用处,用的时候请求一个Session就可以了,如果关闭的话,就失去了连接池的功能。这样的话SessionFactory需要重新初始化。
------解决方案--------------------
Sorry,后就不用Hibernate了,记忆出了点问题。
问题应该出在保留的Session和Transaction同步问题上,不是因为close Session.
------解决方案--------------------
这么复杂呀,看不懂
------解决方案--------------------

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有