2016-11-03 71 views
0

當尋找通過一些日誌一個GlassFish服務器是不響應後,我來到這個錯誤:的EclipseLink併發異常

{{[#|2016-06-02T08:37:51.737+0200|WARNING|oracle- 
glassfish3.1.2|org.restlet.Component.ServiceDispatcher|_ThreadID=165;_ThreadName=http-thread-pool-37860(5);|Exception or error caught in status service 
javax.ejb.EJBException 
at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5236) 
at com.sun.ejb.containers.BaseContainer.checkExceptionNoTx(BaseContainer.java:5065) 
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4900) 
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2046) 
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1995) 
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:222) 
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:89) 
at com.sun.proxy.$Proxy228.getKpiValuesFlat(Unknown Source) 
at com.business.renderer.TopSuppliers.getData(TopSuppliers.java:174) 
at com.business.renderer.TopSuppliers.getDataAsJSONTopSuppliers.java:179) 
at com.business.renderer.TopSuppliers.render(TopSuppliers.java:107) 
at com.ui.renderer.engine.AbstractRenderingEngine.render(AbstractRenderingEngine.java:140) 
at com.services.filter.ContainerAdapter.represent(ContainerAdapter.java:311) 
at org.restlet.resource.Resource.getRepresentation(Resource.java:259) 
at org.restlet.resource.Resource.handleGet(Resource.java:425) 
at org.restlet.resource.Finder.handle(Finder.java:470) 
at org.restlet.routing.Filter.doHandle(Filter.java:156) 
at org.restlet.routing.Filter.handle(Filter.java:203) 
at org.restlet.routing.Router.doHandle(Router.java:497) 
at org.restlet.routing.Router.handle(Router.java:737) 
at com.servlets.ServiceDispatcher$1.handle(ServiceDispatcher.java:55) 
at org.restlet.routing.Filter.doHandle(Filter.java:156) 
at org.restlet.routing.Filter.handle(Filter.java:203) 
at org.restlet.routing.Filter.doHandle(Filter.java:156) 
at org.restlet.routing.Filter.handle(Filter.java:203) 
at org.restlet.routing.Filter.doHandle(Filter.java:156) 
at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:151) 
at org.restlet.routing.Filter.handle(Filter.java:203) 
at org.restlet.routing.Filter.doHandle(Filter.java:156) 
at org.restlet.routing.Filter.handle(Filter.java:203) 
at org.restlet.engine.ChainHelper.handle(ChainHelper.java:111) 
at org.restlet.engine.application.ApplicationHelper.handle(ApplicationHelper.java:72) 
at org.restlet.Application.handle(Application.java:388) 
at org.restlet.routing.Filter.doHandle(Filter.java:156) 
at org.restlet.routing.Filter.handle(Filter.java:203) 
at org.restlet.routing.Router.doHandle(Router.java:497) 
at org.restlet.routing.Router.handle(Router.java:737) 
at org.restlet.routing.Filter.doHandle(Filter.java:156) 
at org.restlet.routing.Filter.handle(Filter.java:203) 
at org.restlet.routing.Router.doHandle(Router.java:497) 
at org.restlet.routing.Router.handle(Router.java:737) 
at org.restlet.routing.Filter.doHandle(Filter.java:156) 
at org.restlet.routing.Filter.handle(Filter.java:203) 
at org.restlet.engine.ChainHelper.handle(ChainHelper.java:111) 
at org.restlet.Component.handle(Component.java:387) 
at org.restlet.Server.handle(Server.java:488) 
at org.restlet.engine.ServerHelper.handle(ServerHelper.java:71) 
at org.restlet.engine.http.HttpServerHelper.handle(HttpServerHelper.java:150) 
at org.restlet.ext.servlet.ServerServlet.service(ServerServlet.java:1037) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) 
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1554) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:339) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at com.jamonapi.JAMonFilter.doFilter(JAMonFilter.java:59) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:278) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:334) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:230) 
at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:311) 
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:189) 
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:850) 
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:747) 
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1032) 
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:231) 
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: Exception [EclipseLink-2004] (Eclipse Persistence Services - 2.3.4.v20151027-346465e): org.eclipse.persistence.exceptions.ConcurrencyException 
Exception Description: A signal was attempted before wait() on ConcurrencyManager. This normally means that an attempt was made to 
commit or rollback a transaction before it was started, or to rollback a transaction twice. 
at org.eclipse.persistence.exceptions.ConcurrencyException.signalAttemptedBeforeWait(ConcurrencyException.java:84) 
at org.eclipse.persistence.internal.helper.ConcurrencyManager.releaseReadLock(ConcurrencyManager.java:489) 
at org.eclipse.persistence.internal.identitymaps.CacheKey.releaseReadLock(CacheKey.java:386) 
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.cloneAndRegisterObject(UnitOfWorkImpl.java:1018) 
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.cloneAndRegisterObject(UnitOfWorkImpl.java:929) 
at org.eclipse.persistence.internal.sessions.UnitOfWorkIdentityMapAccessor.getAndCloneCacheKeyFromParent(UnitOfWorkIdentityMapAccessor.java:181) 
at org.eclipse.persistence.internal.sessions.UnitOfWorkIdentityMapAccessor.getFromIdentityMap(UnitOfWorkIdentityMapAccessor.java:120) 
at org.eclipse.persistence.internal.sessions.IdentityMapAccessor.getFromIdentityMap(IdentityMapAccessor.java:380) 
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerExistingObject(UnitOfWorkImpl.java:3899) 
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerExistingObject(UnitOfWorkImpl.java:3854) 
at org.eclipse.persistence.mappings.CollectionMapping.buildElementUnitOfWorkClone(CollectionMapping.java:267) 
at org.eclipse.persistence.mappings.CollectionMapping.buildElementClone(CollectionMapping.java:279) 
at org.eclipse.persistence.internal.queries.ContainerPolicy.addNextValueFromIteratorInto(ContainerPolicy.java:213) 
at org.eclipse.persistence.mappings.CollectionMapping.buildCloneForPartObject(CollectionMapping.java:205) 
at org.eclipse.persistence.internal.indirection.UnitOfWorkQueryValueHolder.buildCloneFor(UnitOfWorkQueryValueHolder.java:51) 
at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiateImpl(UnitOfWorkValueHolder.java:161) 
at org.eclipse.persistence.internal.indirection.UnitOfWorkValueHolder.instantiate(UnitOfWorkValueHolder.java:222) 
at org.eclipse.persistence.internal.indirection.DatabaseValueHolder.getValue(DatabaseValueHolder.java:88) 
at org.eclipse.persistence.indirection.IndirectList.buildDelegate(IndirectList.java:244) 
at org.eclipse.persistence.indirection.IndirectList.getDelegate(IndirectList.java:414) 
at org.eclipse.persistence.indirection.IndirectList$1.<init>(IndirectList.java:542) 
at org.eclipse.persistence.indirection.IndirectList.listIterator(IndirectList.java:541) 
at org.eclipse.persistence.indirection.IndirectList.iterator(IndirectList.java:505) 
at com.business.frontend.facade.impl.FrontEndBFBean.combineAllContainerKpis(FrontEndBFBean.java:515) 
at com.business.frontend.facade.impl.FrontEndBFBean.getKpiValuesFlat(FrontEndBFBean.java:405) 
at sun.reflect.GeneratedMethodAccessor237.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052) 
at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124) 
at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5409) 
at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619) 
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800) 
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571) 
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162) 
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144) 
at sun.reflect.GeneratedMethodAccessor170.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861) 
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800) 
at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:370) 
at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5381) 
at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5369) 
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:214) 
... 75 more 

在進一步的檢查我notised行:

_ThreadID=165;_ThreadName=http-thread-pool-37860(5); 

Exception [EclipseLink-2004] (Eclipse Persistence Services - 2.3.4.v20151027-346465e) 

我最初的想法是認爲該HTTP線程timeouted等待數據庫調用完成,然後HTTP線程中斷EclipseLink,留下處於意外狀態的ConcurrencyManager(DeferredLock事實上在使用後不會釋放)。我做了一個小應用程序,通過調用服務器設置並在數據庫調用準備好之前對數據庫進行長時間調用並終止http調用來測試我的假設,但這似乎沒有再現問題。還有一個事實是,發生異常時調用的方法不使用任何種類的JPA(ORM),該調用使用JDBC。大多數應用程序使用EclipseLink和JPA,但不是這部分。此外,應用程序處於繁重的數據庫使用情況下並不罕見。

所以我在想,從描述(This normally means that an attempt was made to commit or rollback a transaction before it was started, or to rollback a transaction twice)這個錯誤appart背後的原因是什麼,我敢肯定代碼沒有這樣做。

所以這一定是有些懶加載衝突,但我不知道是什麼情況會導致這個問題。

我不知道在哪裏從這點向前進行調查。任何想法都很好歡迎:)

+0

錯誤來自JPA來 - 是觸發實體的懶惰關係從一個EntityManager讀入。這觸發它重新使用實體讀取的上下文來獲取數據,並給你這個例外。檢查您的FrontEndBFBean,看看它是如何讀取它在combineAllContainerKpis方法中使用的數據 - 您可能希望對此關係使用一個讀取連接,以便它被熱切地獲取。您也可能在多線程環境中使用這些數據--EM和獲取的實體並非真正線程安全。 – Chris

+0

@Chris這似乎是理性的問題,因爲那裏有懶惰的加載。您能否更具體地瞭解延遲加載如何觸發「在ConcurrencyManager出現wait()之前嘗試過的信號」錯誤。我無法弄清楚爲什麼一些簡單的閱讀(沒有寫作)會觸發這樣的錯誤。 'FrontEndBFBean'也只是一個staless bean,所以容器在不同的實例上同時處理bean上兩個方法的調用。 您可以將它作爲答案發布,以便將其標記爲正確的答案。 – user3719857

+0

@Chris'這會觸發它重新使用實體讀取的上下文來獲取數據,並給你這個例外。'你能澄清一下嗎?謝謝:) – user3719857

回答

1

在這種錯誤的情況下,對於併發異常的確切原因尚不清楚 - 我們只能看到一個線程訪問的情況下,通過觸發對實體慵懶的關係。如何讀入這個實體,以及其他線程中發生的事情,這些線程可能也使用這個EntityManager(直接或間接地通過訪問從它讀取的實體)讀取實體,這需要追蹤,但通常可以避免。

EntityManagers是註定不會被多個線程訪問,所以不處理的併發訪問。從EntityManagers中讀入的實體對它們讀取的上下文有很多鉤子;這些鉤子允許懶惰的關係,更改跟蹤等對應用程序發生透明。這樣做的後果是,雖然這些實體也不能同時訪問 - 它們不應該被緩存或由應用程序繞過,沒有仔細考慮。在很多情況下,應用程序最好讓JPA處理緩存,並根據需要從上下文訪問實體。