Jakarta EE 8 JTA事务运行超2分钟即中止问题求助
事务超时导致EJB调用失败问题求助
环境信息
- Apache Netbeans 16
- Glassfish 6.2.5
- JPA 3.0 + Hibernate,事务类型为JTA
问题现象
每当事务运行超过2分钟时,会自动中止并抛出jakarta.ejb.TransactionRolledbackLocalException,完整错误栈如下:
A system exception occurred during an invocation on EJB PaiementreservationFacade, method: public java.util.List dao.PaiementreservationFacade.getPaiementreservationPortemonnaieByPersonne(java.lang.Integer,int)|#] jakarta.ejb.TransactionRolledbackLocalException: Client's transaction aborted at com.sun.ejb.containers.EJBContainerTransactionManager.useClientTx(EJBContainerTransactionManager.java:334) at com.sun.ejb.containers.EJBContainerTransactionManager.preInvokeTx(EJBContainerTransactionManager.java:228) at com.sun.ejb.containers.BaseContainer.preInvokeTx(BaseContainer.java:4001) at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1767) at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:186) at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:64) at jdk.proxy60/jdk.proxy60.$Proxy1268.getPaiementreservationPortemonnaieByPersonne(Unknown Source) at BusinessService.FactureManager.create(FactureManager.java:931) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.glassfish.exousia.AuthorizationService.lambda$invokeBeanMethod$6(AuthorizationService.java:501) at org.glassfish.exousia.AuthorizationService.runInScope(AuthorizationService.java:577) at org.glassfish.exousia.AuthorizationService.invokeBeanMethod(AuthorizationService.java:501) at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:295) at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4241) at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:603) at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:805) at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:552) at org.jboss.weld.module.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:72) at org.jboss.weld.module.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:52) at jdk.internal.reflect.GeneratedMethodAccessor199.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:867) at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:804) at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:552) at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:136) at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:113) at jdk.internal.reflect.GeneratedMethodAccessor200.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:867) at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:804) at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:348) at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4216) at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4206) at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:188) at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:64) at jdk.proxy60/jdk.proxy60.$Proxy1444.create(Unknown Source)
当前persistence.xml配置
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <persistence xmlns="https://jakarta.ee/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd" version="3.0"> <persistence-unit name="myApp" transaction-type="JTA"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <jta-data-source>jdbc/MyApp</jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/> <property name="hibernate.dialect.storage_engine" value="innodb"/> <!--<property name = "hibernate.show_sql" value = "true" />--> <!--<property name="hibernate.jdbc.time_zone" value="CET"/>--> </properties> </persistence-unit> </persistence>
已尝试的无效操作
- 在persistence.xml中添加以下属性,改用javax前缀也无效果:
<property name="jakarta.persistence.lock.timeout" value="1"/> <property name="jakarta.persistence.query.timeout" value="1"/> - 在REST请求开头添加125秒休眠,休眠结束后首次操作数据库仍触发相同错误:
try { System.out.println("Sleep starts"); Thread.sleep(125000); System.out.println("Sleep ends"); } catch (InterruptedException e) { e.printStackTrace(); }
请求解决思路
目前无法找到有效延长事务超时时间的配置方式,恳请提供可行的解决方向。
内容的提问来源于stack exchange,提问作者Chatis
相关产品推荐
相关产品推荐

