大牛进来帮我看看,hibernate,诡异的session is closed

危险的大猫 2010-05-17 09:06:50
这是控制台的错误信息
org.hibernate.SessionException: Session is closed!
at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72)
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1456)
at sun.reflect.GeneratedMethodAccessor44.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:344)
at $Proxy0.beginTransaction(Unknown Source)
at cn.edu.xmut.filter.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:37)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Thread.java:619)


at cn.edu.xmut.filter.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:37)
这一行的代码是:
public class HibernateSessionFilter implements Filter {

private Transaction tx;
private SessionFactory sessionfactory;
public void destroy() {

sessionfactory.close();
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try
{
Session session = sessionfactory.getCurrentSession();
//System.out.println("session state="+session.isOpen());当出现错误的时候打印,结果为false
if(!session.isOpen()){
session=SessionFactoryUtil.getSessionFactory().getCurrentSession();
//System.out.println("session state="+session.isOpen());//重新生成session,依然是false
}
tx=session.beginTransaction();//控制台提示错误的那一行
chain.doFilter(request, response);
if(tx.isActive())
{
tx.commit();

}
}catch(Exception e)
{
e.printStackTrace();
if(tx.isActive())
{
tx.rollback();
}
}
}

public void init(FilterConfig arg0) throws ServletException {
sessionfactory=SessionFactoryUtil.getSessionFactory();
}

}


有时候出现这个问题,有时候不出现,重启tomcat又不会了.
...全文
518 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
危险的大猫 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 bao110908 的回复:]
既然你在我的留言板上留了言,那我只能来回复一下说抱歉了——我不会 Hibernate 呢。

private Transaction tx; 你把这个改成局部变量试试看。
[/Quote]恩,谢谢,我试一下
  • 打赏
  • 举报
回复
既然你在我的留言板上留了言,那我只能来回复一下说抱歉了——我不会 Hibernate 呢。

private Transaction tx; 你把这个改成局部变量试试看。
危险的大猫 2010-05-18
  • 打赏
  • 举报
回复
自己顶上去
危险的大猫 2010-05-18
  • 打赏
  • 举报
回复
快来人呀…\^O^/
危险的大猫 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhangsiwei_1001 的回复:]

session open过了吗?
if(!session.isOpen()){
//session 没有打开过, 打开
session = SessionFactoryUtil.getSessionFactory().openSession();
} else {
//session 打开过,获取当前session
session=Se……
[/Quote]谢谢楼上的回答,但是opensession好像也是获得一个session,而不是打开session,而且getcurrentsession也是用来获得session.
zhangsiwei_1001 2010-05-18
  • 打赏
  • 举报
回复
session open过了吗?
if(!session.isOpen()){
//session 没有打开过, 打开
session = SessionFactoryUtil.getSessionFactory().openSession();
} else {
//session 打开过,获取当前session
session=SessionFactoryUtil.getSessionFactory().getCurrentSession();
}
危险的大猫 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 japt88_115656292 的回复:]

我90%确定,你是能得到session的,但是你得到的session是一个关闭的session。,

也就是说你执行getCurrentSession()的确得到了一个session,但是是一个关闭的session。

如果答案有用就把你的分都借我吧。。
[/Quote]的确,是可以得到,但是得到的是关闭的session,是什么原因呢,麻烦说一下。
japt88_115656292 2010-05-18
  • 打赏
  • 举报
回复
我90%确定,你是能得到session的,但是你得到的session是一个关闭的session。,

也就是说你执行getCurrentSession()的确得到了一个session,但是是一个关闭的session。

如果答案有用就把你的分都借我吧。。
危险的大猫 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 bao110908 的回复:]
加点日志吧,否则啥都看不出来:


Java code
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
Transaction tx = null;
……
[/Quote]暂时还没发现问题,我用你给我的那个文档重写了一边HibernateSessionFilter ,真是麻烦你了. 不知道解决了没有.
  • 打赏
  • 举报
回复
加点日志吧,否则啥都看不出来:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
Transaction tx = null;
try {
Session session = sessionfactory.getCurrentSession();
log.debug("filter get session: " + session + ", isOpen? " + session.isOpen());
if(!session.isOpen()){
log.debug("filter current session isClosed, error"); // TO-DO
session=SessionFactoryUtil.getSessionFactory().getCurrentSession(); // 这句话没用,意义跟上面那句一样!
}
tx = session.beginTransaction();
logTx(tx, "start transaction, and execute filter chain");
chain.doFilter(request, response);
logTx(tx, "filter chain finished, then process transaction");
if(tx.isActive()) {
tx.commit();
logTx(tx, "transaction commit finished");
}
} catch(Exception e) {
log.error("exception throwed, to rollback transaction...");
if(tx.isActive()) {
tx.rollback();
logTx(tx, "transaction rollback finished");
}
}
}

private void logTx(Transaction tx, String info) {
if(log.isDebugEnabled()) {
if(tx == null) {
log.debug(info + ", but transaction is null!");
return;
}
log.debug(info + ", transaction " + tx + ", isActive? " + tx.isActive());
}
}
危险的大猫 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 japt88_115656292 的回复:]
引用 9 楼 lianghaijian 的回复:

引用 8 楼 japt88_115656292 的回复:

我90%确定,你是能得到session的,但是你得到的session是一个关闭的session。,

也就是说你执行getCurrentSession()的确得到了一个session,但是是一个关闭的session。

如果答案有用就把你的分都借我吧。。
的确,是可以得……
[/Quote]
那需要怎么解决呢? 当第一次出现session is cloased的时候,就算请求一个静态页面,也会出现这个异常,然后导致页面空白,或者排版变乱
blackhumor_7 2010-05-18
  • 打赏
  • 举报
回复
你的mysql密码和你Hiber配置文件里的密码不一致!
japt88_115656292 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lianghaijian 的回复:]

引用 8 楼 japt88_115656292 的回复:

我90%确定,你是能得到session的,但是你得到的session是一个关闭的session。,

也就是说你执行getCurrentSession()的确得到了一个session,但是是一个关闭的session。

如果答案有用就把你的分都借我吧。。
的确,是可以得到,但是得到的是关闭的session,是什么原因呢,麻……
[/Quote]
还不明白吗? 意思你放进去的session的确是开着的。但是我把session关闭了,你取出来的session就是关闭了,你取出来的session是开是关 和你放进去的session无关。

或者这么和你说,你代码里面在不应该关闭session的地方关闭了session。 我不知道你为什么要关闭它。有时候是不需要关闭了。光看这个类应该看不出来什么错误要结合其他去看的。
lww7329 2010-05-18
  • 打赏
  • 举报
回复
以前也出现过类似的情况就是hibernate配置文件中

把lazy从true该成false,让查询的时候,查询出所有关联的数据

如果没有lazy 添加上lazy="false"
kangxiong2000 2010-05-18
  • 打赏
  • 举报
回复
SessionFactoryUtil
public static void close()
{
sf.getCurrentSession().beginTransaction().commit();
}
把这个方法去掉。不要调用这个方法。
前面已提交过。
试试看吧。
nangonghaopeng 2010-05-18
  • 打赏
  • 举报
回复
鄙人思维粗浅 仅供参考
不是大牛 只是略懂略懂
nangonghaopeng 2010-05-18
  • 打赏
  • 举报
回复
没有及时关闭连接 再有用户登录 是你的可用连接数减少
举个例子
假如 你有一个房间(系统) 你有200个钥匙 当有人要进房间的时候你的管家会给他一把钥匙 当他离开时归还钥匙与管家(正常退出或注销)
非正常时(没有归还钥匙给管家) 这样一直下去 200个钥匙总有用完的时候
当有一个人未归还钥匙时 你只能提供(200-1)个钥匙提供给要进房间的人
think over

lu76689614 2010-05-18
  • 打赏
  • 举报
回复
hibernate配置文件中

把lazy从true该成false,让查询的时候,查询出所有关联的数据

如果没有lazy 添加上lazy="false"

这属于偷懒的行为
危险的大猫 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 nangonghaopeng 的回复:]
你这个问题是当tomcat运行一段时间后就会出现
当重启tomcat后就会消失
代码没有什么问题
就是异常处理的不全面
要先看什么原因出现这个异常

1 是否有多余的连接
2 是否用户没有正常退出系统(直接关闭浏览器 不是点击退出或注销按钮)
希望对你有用 好运
[/Quote]
非正常退出会出现什么状况.
危险的大猫 2010-05-18
  • 打赏
  • 举报
回复
谢谢火龙果耐心的回答.我改了代码,但是目前没有出现问题,这问题就是头痛,时而出现时而不出现
加载更多回复(17)

81,095

社区成员

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

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