恳请csdn的高手们帮帮忙,Hibernate的session就是打不开???!!!
我用的是 Tomcat6.0 + Java +SqlServer2005 + Hibernate2.1.8
我在Action里,执行完数据库操作,就用HibernateUtil.closeSession()关了session。
但是!!!,调用sessionFactory.openSession()重新打开session,
却出现
net.sf.hibernate.HibernateException: Session is closed
at net.sf.hibernate.impl.SessionImpl.connection(SessionImpl.java:3339)
at net.sf.hibernate.impl.BatcherImpl.prepareQueryStatement(BatcherImpl.java:67)
at net.sf.hibernate.loader.Loader.prepareQueryStatement(Loader.java:784)
at net.sf.hibernate.loader.Loader.doQuery(Loader.java:269)
at net.sf.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:138)
at net.sf.hibernate.loader.Loader.doList(Loader.java:1063)
at net.sf.hibernate.loader.Loader.list(Loader.java:1054)
at net.sf.hibernate.hql.QueryTranslator.list(QueryTranslator.java:854)
at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:1554)
at net.sf.hibernate.impl.QueryImpl.list(QueryImpl.java:49)
at navi_3g.common.CommonDao.getInt(CommonDao.java:93)
at navi_3g.db.dao.BUNRUI1Dao.getBUNRUI1(BUNRUI1Dao.java:14)
at navi_3g.action.Class3Action.execute(Class3Action.java:121)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at navi_3g.filters.CloseSessionFilter.doFilter(CloseSessionFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at navi_3g.filters.SessionFilter.doFilter(SessionFilter.java:35)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at navi_3g.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:75)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)
到底应该怎么做好,真的疯掉了,向大家求救!!!
[解决办法]
private static final SessionFactory sessionFactory;
public static long count = 0;
public static long count1 = 0;
public static final ThreadLocal<Session> session = new ThreadLocal<Session>();
static {
try {
sessionFactory = new Configuration().configure().buildSessionFactory();
} 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.
[解决办法]
这么复杂呀,看不懂
------解决方案--------------------
我要分
[解决办法]
Pool not open, 是因为pool中没有connection了,你看看部署的最大连接数是多少?同时 有多少个访问?刚才所说的Session的close是需要的。建议最好不要用container保留Session 和Transaction. 直接取出的Session获取Transaction处理就可以了。原来的做法在多线操作的时候会有同步问题。
[解决办法]
哈哈……我来啦,只可惜我不太懂……
[解决办法]
今天刚自己写了个hibernate的摸版
测试完全OK
跟楼主的差不多一样
感觉就是session 和 transaction的同步问题
public static void beginTransaction() {
System.out.println("begin tx");
Transaction tx = (Transaction) tLocaltx.get();
try {
if (tx == null) {
tx = currentSession().beginTransaction();//这里你直接在tLocalsess里面取试试
tLocaltx.set(tx);
}
} catch (HibernateException e) {
e.printStackTrace();
}
}
菜鸟的第一次回贴
[解决办法]
去百度搜索去吧
[解决办法]
看不懂....帮顶哈。。
[解决办法]
高手如云啊,学习学习……
[解决办法]
看不懂完全
[解决办法]
学习来的
[解决办法]
会的人来看看 顶你哦
[解决办法]
这个问题的关键在线程中,如果线程关闭了,Session就被释放了,close也不一定有用
请贴出你的线程程序
[解决办法]
高手如云啊,学习学习……
[解决办法]
顶2楼的
[解决办法]
学习来的,同样求教
[解决办法]
不知道hiberante2的openSession();有没有问题
[解决办法]
好难啊 。。。
[解决办法]
要确保事务一定是提交的并且Session是关闭的!
[解决办法]
高手如云
[解决办法]
顶一下哦~~~~~~~~~~~~~~~~~~~~~~~
[解决办法]
..............................................................
[解决办法]
session已经关闭 先别关闭session在测试一下 如果成功 那么你得考虑你的session在那里关闭了
[解决办法]
貌似用openSession()不太好吧。。。
[解决办法]
getCurrentSession()
试试,over
[解决办法]
很久不用hibernate了,以前我也出现这个问题。你可以试一下再上一个操作不要关闭session.或者在这个操作上的映射文件里把lazy改成false。
[解决办法]
检查下你的action代码里面 是不是有在session关闭之后 对加载的对象做了操作。而该对象有相关属性是延迟加载的???
[解决办法]
sesssion 关闭之后 对加载的对象做了操作。而该对象有相关属性是延迟加载的,设置那个一下那个cascade属性。
[解决办法]
应该是Hibernate里的session没有打开。或都与别的SESSION发生冲突了。
------解决方案--------------------
每一步都进行debug,尤其涉及到session的时候,好好跟踪一下