这是控制台的错误信息
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又不会了.
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又不会了.
该个
session = SessionFactoryUtil.getSessionFactory().openSession();看看
if(!session.isOpen()){
//session 没有打开过, 打开
session = SessionFactoryUtil.getSessionFactory().openSession();
} else {
//session 打开过,获取当前session
session=SessionFactoryUtil.getSessionFactory().getCurrentSession();
}
需要在hibernate.cfg.xml中配置:
<property name="hibernate.current_session_context_class">thread</property>
用这个试试看。
http://community.jboss.org/wiki/OpenSessioninView
public class SessionFactoryUtil {
private static SessionFactory sf;
static
{
sf=new Configuration().configure().buildSessionFactory();
}
public static SessionFactory getSessionFactory()
{
return sf;
}
public static void close()
{
sf.getCurrentSession().beginTransaction().commit();
}
}
当重启tomcat后就会消失
代码没有什么问题
就是异常处理的不全面
要先看什么原因出现这个异常 1 是否有多余的连接
2 是否用户没有正常退出系统(直接关闭浏览器 不是点击退出或注销按钮)
希望对你有用 好运
我不知道你这个是否改了?刚才看了一下你的代码,在 commit 和 rollback 中有 isActive,如果这个返回的是 false 的话,那么并不会执行提交回滚什么的,那 ThreadLocalSessionContext 也就不能做清理工作了。你看一下,能否在 finally 中将非 null 的 session 给 close 掉。根据 ThreadLocalSessionContext 的源代码在执行 session 的 close 时会进行清理工作。
举个例子
假如 你有一个房间(系统) 你有200个钥匙 当有人要进房间的时候你的管家会给他一把钥匙 当他离开时归还钥匙与管家(正常退出或注销)
非正常时(没有归还钥匙给管家) 这样一直下去 200个钥匙总有用完的时候
当有一个人未归还钥匙时 你只能提供(200-1)个钥匙提供给要进房间的人
think over
public static void close()
{
sf.getCurrentSession().beginTransaction().commit();
}
把这个方法去掉。不要调用这个方法。
前面已提交过。
试试看吧。
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());
}
}