Hibernate:长CMT事务

时间:2012-12-10 15:07:38

标签: java hibernate java-ee transactions

我有两个bean: FirstBean SecondBean

FirstBean 方法 method1 具有REQUIRED事务属性, SecondBean 具有方法 method2 且具有NOT_SUPPORTED事务属性。 method1调用method2。

@Stateless
class FirstBean implement IFirstBean
{
   ISecondBean secondBean;

   @TransactionAttribute(TransactionAttributeType.REQUIRED)
   void method1()
   {
      //...
      secondBean.method2()
      //...
   }
}

@Stateless
class SecondBean implement ISecondBean
{
   @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
   void method2()
   {
      //....
   }
}   

它运作良好。
但是当method2工作了很长时间(超过4-5分钟)时,我在JBoss 4服务器上获得了异常

Caused by: java.lang.IllegalStateException: [com.arjuna.ats.internal.jta.transaction.arjunacore.inactive] [com.arjuna.ats.internal.jta.transaction.arjunacore.inactive] The transaction is not active!
    at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1379)
    at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:135)  

以及WebLogic 10.3上的下一步

Caused By: org.hibernate.SessionException: Session is closed!
    at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49)
    at org.hibernate.impl.SessionImpl.clear(SessionImpl.java:253)  

方法1完成,并在

之后抛出异常

3 个答案:

答案 0 :(得分:0)

老实说,在所有非交易任务完成之前,我会推迟任何交易工作。通过创建非事务性“包装器”方法轻松完成:

class FirstBean implements IFirstBean {
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public void overlordMethod() {
        secondBean.method2();
        method1();
    }
}

这可以防止不需要事务的长时间运行方法在需要方法的方法中引起问题。现在,完成方法的五分钟是 很多 ,但假设在运行时没有进行任何改进,并且由于某种原因您无法对方法重新排序调用,然后您可以随时增加JTA的事务超时。有关在JBoss 4上执行此操作的各种方法,请阅读here

答案 1 :(得分:0)

在使用JTA事务的JBoss 4.x中,默认超时为5分钟。当调用“方法1”时,您很可能超过正在进行的事务的超时,因为在执行“方法2”时,“方法1”的事务被暂停时经过的时间正在增加。您可以通过将超时增加到一个非常大的值来确认这一点 - JBoss has a TransactionTimeout attribute that you can annotate "method 1" with

One non-obvious thing to remember is that when a transaction is suspended, it doesn't mean that the transactional timer is stopped.

答案 2 :(得分:0)

我最后使用下一个constraction。

@Stateless
class FirstBean implement IFirstBean
{
   ISecondBean secondBean;

   @TransactionAttribute(TransactionAttributeType.REQUIRED)
   void firstPartOfmethod1()
   {
      //...
   }
   @TransactionAttribute(TransactionAttributeType.REQUIRED)
   void secondPartOfmethod1()
   {
      //...
   }
}

@Stateless
class SecondBean implement ISecondBean
{
   @TransactionAttribute(TransactionAttributeType.NEVER)
   void method2()
   {
      //....
   }
}   
@Stateless
class MainBean implement ISecondBean
{
   @TransactionAttribute(TransactionAttributeType.NEVER)
   void mainMethod()
   {
      firstBean.firstPartOfMethod1();
      secondBean.method2();
      firstBean.secondPartOfMethod1();
      //....
   }
}