问题描述
大家好,我在一个类里面执行多线程,会报如下错误:Exceptioninthread"池中线程-20"Exceptioninthread"池中线程-34"org.hibernate.SessionException:Sessionisclosed!atorg.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72)atorg.hibernate.impl.SessionImpl.list(SessionImpl.java:1138)atorg.hibernate.impl.QueryImpl.list(QueryImpl.java:102)atcom.ffcs.upc.thread.modle_thread.ModleThread.run(ModleThread.java:45)atcom.ffcs.upc.util.ThreadPoolUtil$PooledThread.run(ThreadPoolUtil.java:160)线程类:publicclassModleThreadimplementsRunnable{publicModleThread(Stringmdn,StringmainId){super();this.mdn=mdn;this.mainId=mainId;service=SpringContextHolder.getBean("updateModleService");}publicvoidrun(){TUpcRemainMobileremainMobile=newTUpcRemainMobile();List<TUpcRemainMobile>list=service.createQuery("fromTUpcRemainMobilewheremainId=?andmdn=?",mainId,mdn).list();}}
主类里面就是启动多个ModleThread。
解决方案
解决方案二:
session关闭了,看看哪里关了
解决方案三:
看看session的生存周期
解决方案四:
debug每一句执行,看着session状态,找到在哪里关闭即可。
解决方案五:
service = SpringContextHolder.getBean("updateModleService");这个在构造方法执行,使用的是父线程session,而run中使用的新线程。应避免。