2012-06-15 46 views
1

我在執行大量查詢時遇到了問題。當執行大量查詢時(JBoss 5.1)回滾事務

我需要在單個事務中執行超過10000個本地sql查詢。這些查詢是動態生成的,並緩存在系統中。查詢生成完成後,這些數據將在單個事務中發送並逐個執行。該應用程序使用EJB 3開發,並在JBoss 5.1上運行。

如果查詢數小於7200(近似值),則該應用程序可以正常工作。但是如果有更多的查詢,這個方法拋出並且EJB異常並且事務被回滾。沒有數據持久。

這是發生回滾的地方。 [只有當查詢數量超過7200]

@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public void confirmOrder(String[] queries) { 
    for (int i = 0; i < queries.length; i++) { 
     em.createNativeQuery(queries[i]).executeUpdate();  //line # 108 
    } 
    BigInteger bigInt = (BigInteger)em.createNativeQuery("select max(id) from order_item").getSingleResult(); 
    return bigInt!=null ? Long.valueOf(bigInt.longValue()) : null; 
} 

是否有提高,可以在事務中執行的查詢號碼的方法嗎? 請在此提出您的建議。

/

的Viraj
The following is the error trace. 

17:36:33,233 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TransactionReaper_18] - TransactionReaper::check timeout for TX -3f57767b:bc55:4fd9d129:e3a3 in state RUN 
17:36:33,238 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TransactionReaper_7] - TransactionReaper::doCancellations worker Thread[Thread-10,5,jboss] successfully canceled TX -3f57767b:bc55:4fd9d129:e3a3 
17:36:33,635 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TransactionReaper_18] - TransactionReaper::check timeout for TX -3f57767b:bc55:4fd9d129:e3bf in state RUN 
17:36:33,636 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.BasicAction_58] - Abort of action id -3f57767b:bc55:4fd9d129:e3bf invoked while multiple threads active within it. 
17:36:33,636 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.CheckedAction_2] - CheckedAction::check - atomic action -3f57767b:bc55:4fd9d129:e3bf aborting with 1 threads active! 
17:36:34,135 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TransactionReaper_18] - TransactionReaper::check timeout for TX -3f57767b:bc55:4fd9d129:e3bf in state CANCEL 
17:36:34,635 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TransactionReaper_18] - TransactionReaper::check timeout for TX -3f57767b:bc55:4fd9d129:e3bf in state CANCEL_INTERRUPTED 
17:36:34,636 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TransactionReaper_6] - TransactionReaper::check worker Thread[Thread-10,5,jboss] not responding to interrupt when cancelling TX -3f57767b:bc55:4fd9d129:e3bf -- worker marked as zombie and TX scheduled for mark-as-rollback 
17:36:34,636 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TransactionReaper_11] - TransactionReaper::check failed to mark TX -3f57767b:bc55:4fd9d129:e3bf as rollback only 
17:36:34,904 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator_4] TwoPhaseCoordinator.afterCompletion - returned failure for com.ar[email protected]5a720719 
17:36:34,926 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TransactionReaper_13] - TransactionReaper::doCancellations worker Thread[Thread-10,5,jboss] missed interrupt when cancelling TX -3f57767b:bc55:4fd9d129:e3bf -- exiting as zombie (zombie count decremented to 0) ........ 
    ...... 

17:36:34,935 ERROR [CardOrderCreateFacadeBean] Confirming order is failed. 
javax.ejb.EJBTransactionRolledbackException: Executing an update/delete query 
    at org.jboss.ejb3.tx.Ejb3TxPolicy.handleInCallerTx(Ejb3TxPolicy.java:115) 
    at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:130) 
    at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:194) 
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 
    at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76) 
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 
    at org.jboss.ejb3.security.RunAsSecurityInterceptorv2.invoke(RunAsSecurityInterceptorv2.java:94) 
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 
    at org.jboss.ejb3.security.RoleBasedAuthorizationInterceptorv2.invoke(RoleBasedAuthorizationInterceptorv2.java:201) 
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 
    at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:186) 
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102) 
    ........................ 
    ............... 

Caused by: javax.persistence.TransactionRequiredException: Executing an update/delete query 
    at org.hibernate.ejb.QueryImpl.executeUpdate(QueryImpl.java:48) 
    at rk.ejb.eao.OrderEAOImpl.confirmOrder(OrderEAOImpl.java:108) 
    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 org.jboss.aop.joinpoint.MethodInvocation.invokeTarget(MethodInvocation.java:122) 
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:111) 
    at org.jboss.ejb3.EJBContainerInvocationWrapper.invokeNext(EJBContainerInvocationWrapper.java:69) 
    at org.jboss.ejb3.interceptors.aop.InterceptorSequencer.invoke(InterceptorSequencer.java:76) 
    at org.jboss.ejb3.interceptors.aop.InterceptorSequencer.aroundInvoke(InterceptorSequencer.java:62) 
    at sun.reflect.GeneratedMethodAccessor358.invoke(Unknown Source) 
    ........ 
    ....... 

回答

5

我能解決這個問題。雖然它顯示了這樣的異常,但這是由於事務回滾導致的。交易回滾的確切原因是交易時間結束。當有大量的查詢被執行時,事務超時並且最終的結果是上述異常。在JBoss事務配置中進行更改,消除了錯誤。

+0

你能記得的配置,你做到了?我面臨同樣的問題 – adelarsq

+0

根據您的要求,您可以增加全局或方法方面的事務處理時間。 - 如果您想在方法級別執行此操作,可以使用以下注釋。 (超時設置爲1500秒) @TransactionTimeout(1500) 如果要全局執行此操作,則必須編輯位於/deploy目錄中的transaction-jboss-beans.xml並更改超時參數值。 例如:超時值是1200秒 1200 欲瞭解更多信息:[更多信息] https://community.jboss.org/wiki/TransactionTimeout – Viraj

7

您可以根據您的要求在全局或方法級別增加事務處理超時時間。

  • 如果您想在方法級別執行此操作,則可以使用以下注釋 。 (超時設置爲1500秒)@TransactionTimeout(1500)
  • 如果要全局執行此操作,必須編輯位於[server-instance]/deploy目錄中的transaction-jboss-beans.xml並更改超時參數值。 如:超時值1200秒

    <屬性名= 「transactionTimeout」> 1200 < /屬性>

欲瞭解更多信息:https://community.jboss.org/wiki/TransactionTimeout