2013-04-17 3 views
0

Я создаю приложение с пружиной 3 спящего режима Struts 2 с моим sql как задним концом и пулом соединений c3p0 (c3p0-0.9.1.1 jar).Сессия закрыта Исключение

Иногда при выполнении запроса я получаю следующую ошибку. Когда я выполняю запрос, я проверяю, закрыто ли соединение или нет, и если он закрыт, я открою новое соединение перед выполнением запроса. Я предоставляю трассировку стека, которую я получил. Пожалуйста, помогите мне пройти через этот

Apr 16, 2013 18:01:32 505802 [http-apr-80-exec-3] INFO com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor - Session is closed! 
org.hibernate.SessionException: Session is closed! 
    at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49) 
    at org.hibernate.impl.SessionImpl.getBatcher(SessionImpl.java:260) 
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1801) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:674) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) 
    at org.hibernate.loader.Loader.doList(Loader.java:2220) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) 
    at org.hibernate.loader.Loader.list(Loader.java:2099) 
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338) 
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172) 
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121) 
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79) 
    at com.tcs.ignite.junoon.abstractclasses.AbstractService.find(AbstractService.java:207) 
    at com.tcs.ignite.junoon.abstractclasses.AbstractService.find(AbstractService.java:169) 
    at com.tcs.ignite.junoon.services.MasterSchoolService.getAllSchoolList(MasterSchoolService.java:30) 
    at com.tcs.ignite.junoon.actions.user.AddPerson.setupRequiredMaps(AddPerson.java:239) 
    at com.tcs.ignite.junoon.actions.user.AddPerson.execute(AddPerson.java:206) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243) 
    at com.tcs.ignite.junoon.interceptors.LoginCheck.intercept(LoginCheck.java:46) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165) 
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252) 
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68) 
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) 
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) 
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138) 
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176) 
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) 
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) 
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488) 
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) 
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129) 
    at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at com.googlecode.psiprobe.Tomcat70AgentValve.invoke(Tomcat70AgentValve.java:38) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) 
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1770) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

public List<T> find(final Query query, final Object[] values) throws HibernateException, NullPointerException { 
     if (values != null) { 
      for (int i = 0; i < values.length; i++) { 
       query.setParameter(i, values[i]); 
      } 
     } 
     List<T> resultList = null; 
     if (hibernateSession == null || !hibernateSession.isOpen()) { 
      try { 
       openHibernateSession(); 
       resultList = query.list(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       closeHibernateSession(); 
      } 
     } else { 
      resultList = query.list(); 
     } 
     return resultList; 
    } 

public List<T> find(final String queryString, final Object[] values) throws HibernateException { 
     if (hibernateSession == null || !hibernateSession.isOpen()) { 
      openHibernateSession(); 
     } 
     Query queryObject = hibernateSession.createQuery(queryString); 
     return find(queryObject, values); 
    } 

private void openHibernateSession() throws HibernateException { 
    try { 
     hibernateSession = HibernateUtil.getSessionFactory().openSession(); 
     hibernateSession.setFlushMode(FlushMode.MANUAL); 
     hibernateTransaction = hibernateSession.getTransaction(); 
     hibernateTransaction.begin(); 
    } catch (Exception e) {  
     e.printStackTrace(); 
    } 

} 

private void closeHibernateSession() { 
    try { 

     if (hibernateTransaction != null) { 
      hibernateSession.flush(); 
      if (!hibernateTransaction.wasCommitted()) { 
       hibernateTransaction.commit(); 
      } 

     } 
     if (hibernateSession != null) { 
      if (hibernateSession.isOpen()) { 
       hibernateSession.close(); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 


    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/projectdb</property> 
    <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.connection.password">root</property> 

    <property name="show_sql">true</property> 
    <property name="format_sql">true</property> 

    <property name="hbm2ddl.auto">update</property> 
    <property name="hibernate.c3p0.min_size">5</property> 
    <property name="hibernate.c3p0.max_size">20</property> 
    <property name="hibernate.c3p0.timeout">1800</property> 
    <property name="hibernate.c3p0.max_statements">50</property> 
    <property name="hibernate.c3p0.idle_test_period">50</property> 
    <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> 
    <property name="hibernate.c3p0.acquire_increment">2</property> 

    <property name="hibernate.c3p0.usesTraditionalReflectiveProxies">true</property> 
    <property name="connection.pool_size">20</property> 
    <property name="current_session_context_class">thread</property> 
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 

    <property name="hibernate.connection.isolation">4</property> 
+0

Вполне вероятно, что вы можете получить лучший ответ, если вы также разместить код вокруг места, где произошла ошибка. –

+0

@JennyD Infact его не происходит в одном месте. Я встречаюсь случайным образом, когда выполняю какой-либо запрос. Я получаю исключение по разному запросу каждый раз, когда я тестирую. И это происходит только тогда, когда я сталкиваюсь с одновременными пользователями. На этот раз я получил только один раз, когда я ударил 20 одновременно работающих пользователей. – user1850594

+0

Я думал о части кода, которая проверяет, открыто ли соединение, и при необходимости открывает новое соединение. –

ответ

0

Когда вы пытаетесь сохранить или обновить экземпляр переходного процесса, убедитесь, что сущности, связанные с экземпляром, являются постоянными. Это обычная ошибка пользователей, пытающихся сохранить новый экземпляр объекта с отдельными ссылками. Получите объект из контекста персистентности, прежде чем вы установите его ссылку на временный или отсоединенный экземпляр, который вы собираетесь сохранить.

+0

В настоящее время я получаю эту ошибку не только в сохранении или обновлении. Когда я пытаюсь получить некоторые данные, я также получаю это. – user1850594

+0

Тогда у вас есть конфигурация подключенного соединения. при получении некоторых данных соединение закрывается. Опубликуйте свойства c3p0 и hibernate. –

+0

Я добавил часть кода, где я получаю исключение. Пожалуйста, проверьте и предоставьте мне ценные предложения. – user1850594

0

Вы, вероятно, можете устранить свою самую непосредственную проблему довольно легко. пусть ваш closeHibernateSession() надежно устанавливает hibernateSession в null. что заставит ваши функции запросов создавать новые сеансы, а не пытаться повторно использовать старую закрытую сессию.

, но не просто это сделайте. у вас гораздо больше проблем.

Вы должны быть намного чище в том, как вы организуете сеансы спящего режима. из приведенного выше кода ясно, что у вас есть переменная-член, называемая hibernateSession, которая может быть разделена между несколькими вызывающими или несколькими запросами, что иногда является нулевым, а иногда и нет, какие различные функции лениво инициализируются, но могут не закрываться до некоторого времени линия. это не годится.

в простейшем расположении, не удерживайте сессию как переменную-член. удерживайте его как локальную переменную. пусть openHibernateSession() возвращает сеанс, который будет завершен с полной уверенностью в блоке finally. если по какой-то причине вам нужны сеансы, чтобы пережить то, что может быть инкапсулировано одним вызовом функции (который, конечно, может вызвать множество других функций, каждый из которых может принимать сеанс как параметр), вам нужно быть очень осторожным. открытые сессии должны быть надежно закрыты(), и вы должны понимать их жизненные циклы. ваш текущий подход, который использует сеанс, если он уже открыт, но создает временную сессию в противном случае, это не хорошо. если вы настаиваете на сохранении переменной члена Session, вы должны знать с полной определенностью, когда инициализируется переменная-член, точно как и когда она будет закрыта() ed, а затем сбрасывается на null или разыменована для сбора мусора.

Вы также должны понимать свои транзакции, ничто из этого «если у меня есть незафиксированная транзакция до закрытия(), совершите ее».

также, пожалуйста, рассмотреть возможность перехода к c3p0-0.9.2.1