81,095
社区成员
发帖
与我相关
我的任务
分享
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)
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();
}
}
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());
}
}