2012-06-15 2 views
1

У меня проблема с выполнением большого количества запросов.Сделка отменяется при выполнении большого количества запросов (JBoss 5.1)

Мне нужно выполнить более 10 000 запросов sql внутри одной транзакции. Эти запросы генерируются динамически и кэшируются в системе. После завершения генерации запросов они отправляются и выполняются один за другим в рамках одной транзакции. Приложение разработано с использованием EJB 3 и работает на JBoss 5.1.

Приложение работает нормально, если количество запросов меньше 7200 (приблизительное значение). Но если есть больше запросов, чем это, метод throw и 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) Если вы хотите сделать это глобально, вам необходимо отредактировать транзакцию-jboss-beans.xml, расположенную в каталоге /deploy, и изменить тайм-аут значение параметра. например: время ожидания составляет 1200 секунд 1200 Для получения дополнительной информации: [Дополнительная информация] https://community.jboss.org/wiki/TransactionTimeout – Viraj

7

Вы можете увеличить время транзакций во всем мире или на уровне метода в соответствии с вашими требованиями.

  • Если вы хотите сделать это на уровне метода, может использоваться следующая аннотация: . (тайм-аут установлен на 1500 секунд) @TransactionTimeout (1500)
  • Если вы хотите сделать это глобально, вам нужно отредактировать транзакцию jboss-beans.xml, расположенную в каталоге [server-instance]/deploy, и изменить тайм-аут значение параметра. например: тайм-аут значение составляет 1200 секунд

    < имя свойства = "transactionTimeout"> 1200 </недвижимость>

Для получения дополнительной информации: https://community.jboss.org/wiki/TransactionTimeout

Смежные вопросы