2017-04-13 14 views
0

我得到了一個在Wildfly jboss中運行的Hibernate項目。當我運行一個高負荷測試隨機拋出這個錯誤:在wilfdlfy +休眠堆棧中ReslutSet關閉錯誤



    2017-04-11 19:58:49,758 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-42) IJ031050: The result set is closed 
    2017-04-11 19:58:49,758 ERROR [com.omnia.pie.ws.TransactionDataControllerImpl] (default task-42) Transaction save failed: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not insert: [com.transaction.hibernate.model.NonTlf] 
     at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1692) 
     at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602) 
     at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1608) 
     at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1152) 
     at com.omnia.pie.ws.TransactionDataControllerImpl.saveNonTlfTransaction(TransactionDataControllerImpl.java:323) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 
     at org.jboss.as.ee.component.ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptor.java:52) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:437) 
     at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.doMethodInterception(Jsr299BindingsInterceptor.java:82) 
     at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:93) 
     at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:63) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.as.ejb3.component.invocationmetrics.ExecutionTimeInterceptor.processInvocation(ExecutionTimeInterceptor.java:43) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.as.jpa.interceptor.SBInvocationInterceptor.processInvocation(SBInvocationInterceptor.java:47) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:437) 
     at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:73) 
     at org.jboss.as.weld.ejb.EjbRequestScopeActivationInterceptor.processInvocation(EjbRequestScopeActivationInterceptor.java:83) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:21) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) 
     at org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(ComponentDispatcherInterceptor.java:52) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.as.ejb3.component.pool.PooledInstanceInterceptor.processInvocation(PooledInstanceInterceptor.java:51) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:275) 
     at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:327) 
     at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:239) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.as.ejb3.component.invocationmetrics.WaitTimeInterceptor.processInvocation(WaitTimeInterceptor.java:43) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.as.ejb3.security.SecurityContextInterceptor.processInvocation(SecurityContextInterceptor.java:100) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory$1.processInvocation(ShutDownInterceptorFactory.java:64) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:66) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:54) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:64) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356) 
     at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:636) 
     at org.jboss.invocation.AccessCheckingInterceptor.processInvocation(AccessCheckingInterceptor.java:61) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356) 
     at org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation(PrivilegedWithCombinerInterceptor.java:80) 
     at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
     at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) 
     at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:195) 
     at org.jboss.as.webservices.invocation.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:137) 
     at org.jboss.wsf.stack.cxf.JBossWSInvoker.performInvocation(JBossWSInvoker.java:169) 
     at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96) 
     at org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker.invoke(AbstractJAXWSMethodInvoker.java:232) 
     at org.apache.cxf.jaxws.JAXWSMethodInvoker.invoke(JAXWSMethodInvoker.java:85) 
     at org.jboss.wsf.stack.cxf.JBossWSInvoker.invoke(JBossWSInvoker.java:145) 
     at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59) 
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
     at org.apache.cxf.interceptor.ServiceInvokerInterceptor$2.run(ServiceInvokerInterceptor.java:126) 
     at org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37) 
     at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:131) 
     at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) 
     at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) 
     at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:251) 
     at org.jboss.wsf.stack.cxf.RequestHandlerImpl.handleHttpRequest(RequestHandlerImpl.java:108) 
     at org.jboss.wsf.stack.cxf.transport.ServletHelper.callRequestHandler(ServletHelper.java:134) 
     at org.jboss.wsf.stack.cxf.CXFServletExt.invoke(CXFServletExt.java:88) 
     at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:293) 
     at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:212) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 
     at org.jboss.wsf.stack.cxf.CXFServletExt.service(CXFServletExt.java:136) 
     at org.jboss.wsf.spi.deployment.WSFServlet.service(WSFServlet.java:140) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
     at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) 
     at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62) 
     at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) 
     at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) 
     at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
     at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) 
     at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57) 
     at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
     at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46) 
     at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64) 
     at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60) 
     at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77) 
     at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50) 
     at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43) 
     at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
     at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) 
     at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
     at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
     at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:284) 
     at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:263) 
     at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81) 
     at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:174) 
     at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202) 
     at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:793) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 
    Caused by: org.hibernate.exception.GenericJDBCException: could not insert: [com.transaction.hibernate.model.NonTlf] 
     at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47) 
     at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109) 
     at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:49) 
     at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2792) 
     at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3363) 
     at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81) 
     at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:597) 
     at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:232) 
     at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:213) 
     at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:256) 
     at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:317) 
     at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:272) 
     at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:178) 
     at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:109) 
     at org.hibernate.jp 

a.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:67) 
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:189) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58) 
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:775) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:748) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:753) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1146) 
    ... 109 more 
Caused by: java.sql.SQLException: IJ031050: The result set is closed 
    at org.jboss.jca.adapters.jdbc.WrappedResultSet.checkState(WrappedResultSet.java:6004) 
    at org.jboss.jca.adapters.jdbc.WrappedResultSet.next(WrappedResultSet.java:2682) 
    at org.hibernate.id.IdentifierGeneratorHelper.getGeneratedIdentity(IdentifierGeneratorHelper.java:70) 
    at org.hibernate.dialect.identity.GetGeneratedKeysDelegate.executeAndExtract(GetGeneratedKeysDelegate.java:61) 
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:42) 
    ... 128 more

的代碼是:



    @Override 
     public synchronized NonTlf saveNonTlfTransaction(NonTlf trandata) { 
      getEntityManager().clear(); 

      try 
      { 
       TSN tsn = null; 

        final String queryString = "select model from TSN model where model.vtmId= :propertyValue"; 
        Query query = getEntityManager().createQuery(queryString); 
        query.setParameter("propertyValue", trandata.getTerminalId()); 
        //System.out.println(trandata.toString()); 


        try { 
         tsn = (TSN) query.getSingleResult(); 

        } catch(NoResultException e) { 
         log.error("Transaction save failed" , e); 
         tsn = new TSN(); 
         tsn.setTsn(1); 
         tsn.setVtmId(trandata.getTerminalId()); 
         getEntityManager().persist(tsn); 
        } 
        if(tsn.getTsn() == 9999) 
         tsn.setTsn(0); 
        tsn.setTsn(tsn.getTsn() + 1); 
        getEntityManager().merge(tsn); 


       trandata.setTsn(String.format("%04d",tsn.getTsn())); 

        getEntityManager().persist(trandata); 

       System.out.println("Transaction id: " + trandata.getId()); 

       return (trandata); 
      } 

      catch(Exception e) 
      { 
       log.error("Transaction save failed" , e); 
       e.printStackTrace(); 
       return (null); 
      } 
     } 

我想這一定是有毛病Wildfly和休眠的互動,becouse我從來沒有見過它在其他環境中。有沒有人遇到這樣的問題?

UPDATE: 這是getEntityManager做什麼:



    public synchronized EntityManager getEntityManager() { 
      return entityManager; 
     } 

什麼特別的地方。這是怎麼獲得的EntityManager:



    public static EntityManagerFactory entityManagerFactory; 
     @PersistenceContext 
     public static EntityManager entityManager; 
     private static Logger log = Logger.getLogger(TransactionDataControllerImpl.class.getName()); 

     static 
     { 
      if(entityManagerFactory == null) 
       entityManagerFactory = Persistence.createEntityManagerFactory("manager1"); 

      entityManager = entityManagerFactory.createEntityManager(); 
     } 

+1

getEntityManager()做了什麼(顯示代碼)? –

+0

感謝您的回答!更新。 – Frosty

+0

哪行引發ResultSet關閉的異常?堆棧跟蹤不會在代碼中顯示關於此錯誤的任何行。 –

回答

1

我懷疑這:

值java.sql.SQLException:IJ031050:結果集關閉

是的結果實體管理器在線程之間共享。

我認爲你需要使用數據庫來管理鎖定。如果你修改你的代碼有點像:

@Stateless 
public class TransactionDataControllerImpl { 

    private static Logger log = ...; 

    @PersistenceContext 
    private EntityManager entityManager; 

    public NonTlf saveNonTlfTransaction(NonTlf trandata) { 
     try 
     { 
      TSN tsn = null; 

      final String queryString = "select model from TSN model where model.vtmId= :propertyValue"; 
      TypedQuery<TSN> query = entityManager.createQuery(queryString, TSN.class); 
      query.setLockMode(LockModeType.PESSIMISTIC_WRITE); 
      query.setParameter("propertyValue", trandata.getTerminalId()); 
      //System.out.println(trandata.toString()); 

      try { 
       tsn = query.getSingleResult(); 

      } catch(NoResultException e) { 
       log.error("Transaction save failed" , e); // what does this mean? 
       tsn = new TSN(); 
       tsn.setTsn(1); 
       tsn.setVtmId(trandata.getTerminalId()); 
       entityManager.persist(tsn); 
       entityManager.lock(tsn, LockModeType.PESSIMISTIC_WRITE); 
      } 
      if(tsn.getTsn() == 9999) 
       tsn.setTsn(0); 
      tsn.setTsn(tsn.getTsn() + 1); 
      tsn = entityManager.merge(tsn); 

      trandata.setTsn(String.format("%04d",tsn.getTsn())); 

      entityManager.persist(trandata); 

      System.out.println("Transaction id: " + trandata.getId()); 

      return (trandata); 
     } catch(Exception e) { 
      log.error("Transaction save failed" , e); 
      e.printStackTrace(); 
      return (null); 
     } 
    } 

} 

這應該會產生更好的行爲。如果你的實體每個都有一個@Version帶註釋的列,它將會有所幫助。

+0

是的,看起來像做了這項工作。非常感謝! – Frosty