2011-11-26 83 views
0

我在persistence.xml中有两个持久性单元,一个XA和另一个非xa(为了提高性能,当工作仅仅关联到单个数据源,而我不需要全局事务)。在javaee中集成多个持久性单元(xa和非xa)

<persistence-unit name="pu-negin88" transaction-type="JTA"> 
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
    <jta-data-source>jdbc/glDS</jta-data-source> 
    <non-jta-data-source>jdbc/glDS</non-jta-data-source> 
</persistence-unit> 

<persistence-unit name="pu-nonxa" transaction-type="JTA"> 
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
    <jta-data-source>jdbc/bancononxaDS</jta-data-source> 
</persistence-unit> 

我传递由XA持久性单元在使用非XA持久性单元,并且需要一个新的事务无状态会话bean加载到对象的方法。在这个会话bean我使用这个对象的某些属性加载从DD其他对象,并在这个时候,我发现了以下异常:

javax.ejb.AccessLocalException: Client not authorized for this invocation. 
     at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1218) 
     at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:195) 
     at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:83) 
     at $Proxy604.expireUserSession1(Unknown Source) 
     at com.kishware.core.framework.controller.AuthenticationController.control(AuthenticationController.java:60) 
     at com.kishware.core.framework.interceptors.TosanBusinessMethodInterceptor._intercept(TosanBusinessMethodInterceptor.java:339) 
     at com.kishware.core.framework.interceptors.TosanBusinessMethodInterceptor.intercept(TosanBusinessMethodInterceptor.java:190) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:579) 
     at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:483) 
     at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:205) 
     at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3978) 
     at com.sun.ejb.containers.WebServiceInvocationHandler.invoke(WebServiceInvocationHandler.java:189) 
     at $Proxy395.deposit(Unknown Source) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at com.sun.enterprise.webservice.InvokerImpl.invoke(InvokerImpl.java:81) 
     at com.sun.enterprise.webservice.EjbInvokerImpl.invoke(EjbInvokerImpl.java:82) 
     at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:146) 
     at com.sun.xml.ws.server.sei.EndpointMethodHandler.invoke(EndpointMethodHandler.java:257) 
     at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:93) 
     at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:595) 
     at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:554) 
     at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:539) 
     at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:436) 
     at com.sun.xml.ws.api.pipe.helper.AbstractTubeImpl.process(AbstractTubeImpl.java:106) 
     at com.sun.enterprise.webservice.MonitoringPipe.process(MonitoringPipe.java:147) 
     at com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:115) 
     at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:595) 
     at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:554) 
     at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:539) 
     at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:436) 
     at com.sun.xml.ws.api.pipe.helper.AbstractTubeImpl.process(AbstractTubeImpl.java:106) 
     at com.sun.xml.ws.tx.service.TxServerPipe.process(TxServerPipe.java:317) 
     at com.sun.enterprise.webservice.CommonServerSecurityPipe.processRequest(CommonServerSecurityPipe.java:218) 
     at com.sun.enterprise.webservice.CommonServerSecurityPipe.process(CommonServerSecurityPipe.java:129) 
     at com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:115) 
     at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:595) 
     at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:554) 
     at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:539) 
     at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:436) 
     at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:243) 
     at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:444) 
     at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:244) 
     at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:135) 
     at com.sun.enterprise.webservice.Ejb3MessageDispatcher.handlePost(Ejb3MessageDispatcher.java:113) 
     at com.sun.enterprise.webservice.Ejb3MessageDispatcher.invoke(Ejb3MessageDispatcher.java:87) 
     at com.sun.enterprise.webservice.EjbWebServiceServlet.dispatchToEjbEndpoint(EjbWebServiceServlet.java:226) 
     at com.sun.enterprise.webservice.EjbWebServiceServlet.service(EjbWebServiceServlet.java:155) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:831) 
     at com.sun.enterprise.web.AdHocContextValve.invoke(AdHocContextValve.java:114) 
     at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632) 
     at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577) 
     at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571) 
     at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:87) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206) 
     at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632) 
     at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577) 
     at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571) 
     at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150) 
     at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632) 
     at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577) 
     at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571) 
     at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080) 
     at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:272) 
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:719) 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:684) 
     at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:561) 
     at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:666) 
     at java.lang.Thread.run(Thread.java:662) 

回答

1

(以提高性能时,工作只相关型号到一个数据源,我不需要全局事务)。

首先,您是否真的测量过这会提高性能?作为一般规则,当只有1个事务资源参与事务时,事务提供者会自动进行优化。

就实际例外而言,也许你应该显示你实际使用的代码。我想知道用于通过XA持久性单元加载实体的事务是否已经结束。

如果交易已经结束,您的实体将被分离,并且没有人会记得它原来来自哪里。由于您提到的其他无状态会话bean需要新的事务,因此您有一种嵌套事务形式,如果实体的属性被延迟加载,则可能会出现问题。

通常,AccessLocalException实际上更多地表示安全问题,例如,当两个bean处于不同的安全领域时和/或在安全主体(调用者)不具有的安全领域上定义它们时。

0

我解决了这个问题,现在我没有这个例外。这是因为第一个持久化单元加载的对象在第二个持久化单元中处于非托管状态,并且当我想要使用该对象时,此异常被抛出。我使用了getReference()方法,并从主对象中创建一个空心对象,并完成了我的工作。