首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免容器管理的EntityManager超时

避免容器管理的EntityManager超时
EN

Stack Overflow用户
提问于 2014-10-13 13:58:18
回答 2查看 6K关注 0票数 6

我有一个J2EE应用程序,其bean具有容器管理的EntityManager。

RollbackException (超时)

我尝试过使用EntityManagerFactory,但似乎不允许这样做:

使用JTA时不能使用EntityTransaction

如何在不设置不合理的超时的情况下运行任意长的进程?如果需要,JTA不能创建一个新事务吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-16 15:02:31

在我的问题、这个问题和文档这里的注释之后,我使用容器管理的EntityManager和TransactionAttributeType注释解决了这个问题。

导致超时的bean方法现在对处理子任务的不同方法执行多次调用,例如每个方法调用在不同的事务中执行。我使用NOT_SUPPORTED属性类型,因为:

如果客户端与事务没有关联,容器在运行该方法之前不会启动新事务。

使用这种安排,只有较小的processDoc方法才会创建不应该超时的事务。

代码语言:javascript
复制
public class MyBean {
    @EJB
    private DocsBean docsBean;

    /**
     * This method transaction risks a timeout
     * so no transaction is created with NOT_SUPPORTED
     */
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public void longRunning(List<Document> docs) {
        for (Document doc : docs) {
            // a different transaction is used for each element
            docsBean.processDoc(doc);
        }
    }
}

public class DocsBean {
    /** Runs within a new transaction */
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void processDoc(Document document) {
        // takes some time but under the timeout
        // ...
    }
}

票数 5
EN

Stack Overflow用户

发布于 2014-10-13 15:09:04

使用UserTransaction怎么样?

代码语言:javascript
复制
@Resource
private UserTransaction tx;

@TransactionAttribute(TransactionAttributeType.NotSupported)
public void merge(SomeEntity e) {
   tx.setTransactionTimeout(60 * 1000); //one minute
   tx.begin();
   try {
      entityManager.merge(e);
      tx.commit();
   } catch(IllegalArgumentException ex) { 
       tx.rollback();
   }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26341801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档