我是彻底疯了,java.lang.RuntimeException: Session is closed!

java_37 2012-08-01 03:32:01
java.lang.RuntimeException: Session is closed!

这到底怎么回事,第一次可以,但第二次马上就爆这个错误!!!
package com.sina.util;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
final public class HibernateUtil {
private static SessionFactory sessionFactory=null;
//用ThreadLocal模式 (线程局部变量模式) 管理Session
private static ThreadLocal threadLocal=new ThreadLocal();

private HibernateUtil(){};
static {
sessionFactory=new Configuration().configure().buildSessionFactory();
}
public static Session openSession(){
return sessionFactory.openSession();
}
public static Session getCurrentSession(){
Session session=(Session) threadLocal.get();
if(session==null){
session=sessionFactory.openSession();
//把session对象设置到threadLocal,相当于session和线程已经绑定
threadLocal.set(session);
}
return session;
}
//提供统一的查询方法
public static List executeQuery (String hql){
Session session=null;
Transaction ts=null;
List list=null;
try{
session=HibernateUtil.getCurrentSession();
ts=session.beginTransaction();
list=session.createQuery(hql).list();
ts.commit();
}catch (Exception e) {
// TODO: handle exception
if (ts!=null) {
ts.rollback();
}
throw new RuntimeException(e.getMessage());
}finally{
if (session!=null && session.isOpen()) {
session.close();
}
}
return list;
}
}
...全文
889 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
会飞的枫叶 2012-08-03
  • 打赏
  • 举报
回复
使用session.clear();看行不?
风行傲天 2012-08-03
  • 打赏
  • 举报
回复
在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true的话,要在应用层内把关系集合都初始化,如 company.getEmployees(),否则Hibernate抛session already closed Exception; Open Session In View提供了一种简便的方法,较好地解决了lazy loading问题.
配置也比较简单,你可以再网上找到的
secretx 2012-08-02
  • 打赏
  • 举报
回复
gukuitian 基本上说对了,对于你这个代码,最好的补救就是 每次threadLocal.remove();效率之类先不谈,实际上我是第一次见到有人 这样写。并发就会立马死掉。
独爱如风 2012-08-02
  • 打赏
  • 举报
回复
就是你这个session.close()关闭了,下次又调用了这个session。
有可能是你用了事物拦截器吧执行完成操作的session自动关闭,而你又用了一个session.close();
java_37 2012-08-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

gukuitian 基本上说对了,对于你这个代码,最好的补救就是 每次threadLocal.remove();效率之类先不谈,实际上我是第一次见到有人 这样写。并发就会立马死掉。
[/Quote]
那这里面的代码哪段最有问题,我也是按老师说的写的,感觉还是很有道理的,每次执行一次,就判断session,有就关掉
gukuitian 2012-08-01
  • 打赏
  • 举报
回复
你这现在的情况就是每查询一次,开关一次联接。
实际项目中这基本是不可能的,也就是自己做做练习。
上面说的就是把session的生命周期交给web容器来管理。
你可以查查 "hibernate session 生命周期",了解下
java_37 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

你可以把session.close()那句删了,看看
还有一种很常用的就是在web.xml中配置open session in view,就可以避免session关闭的问题了
[/Quote]
这个怎么配,详细点,还有这个open session in view是关于什么知识点的,也麻烦顺带说说吧!!!嘿嘿
java_37 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

threadLocal.remove();
[/Quote]
这个可以 嘿嘿
风行傲天 2012-08-01
  • 打赏
  • 举报
回复
你可以把session.close()那句删了,看看
还有一种很常用的就是在web.xml中配置open session in view,就可以避免session关闭的问题了
gukuitian 2012-08-01
  • 打赏
  • 举报
回复
threadLocal.remove();
java_37 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

throw new RuntimeException(e.getMessage());
你这个看不出东西,把这行注掉,直接e.printStackTrace();

我估计也是3楼的情况,session close之后,threadLocal里面还有存储,
把它清掉试试
[/Quote]
怎么清
gukuitian 2012-08-01
  • 打赏
  • 举报
回复
throw new RuntimeException(e.getMessage());
你这个看不出东西,把这行注掉,直接e.printStackTrace();

我估计也是3楼的情况,session close之后,threadLocal里面还有存储,
把它清掉试试
shuchangkkk 2012-08-01
  • 打赏
  • 举报
回复
第二次登陆时会话变了,session也变了
EverWHL 2012-08-01
  • 打赏
  • 举报
回复
应该是在那个session.close() 之后
又用的那个session了
java_37 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

异常发全了,看看错误出在哪行。
问题再描述的清楚点。什么叫第一次行,第二次就不行了,是query方法?
[/Quote]
就是,我要实现登入功能,第一次登入,是成功的,但第二次在登入的话,就报
Servlet.service() for servlet action threw exception
java.lang.RuntimeException: Session is closed!
at com.sina.util.HibernateUtil.executeQuery(HibernateUtil.java:46)
对应throw new RuntimeException(e.getMessage());


at com.sina.service.UsersService.checkUser(UsersService.java:39)
对应List<Users> list=HibernateUtil.executeQuery(hql);

at com.sina.struts.action.LoginAction.login(LoginAction.java:49)
对应user=usersService.checkUser(user);
gukuitian 2012-08-01
  • 打赏
  • 举报
回复
异常发全了,看看错误出在哪行。
问题再描述的清楚点。什么叫第一次行,第二次就不行了,是query方法?

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧