我有一个J2EE应用程序,其bean具有容器管理的EntityManager。
RollbackException (超时)
我尝试过使用EntityManagerFactory,但似乎不允许这样做:
使用JTA时不能使用EntityTransaction
如何在不设置不合理的超时的情况下运行任意长的进程?如果需要,JTA不能创建一个新事务吗?
发布于 2014-10-16 15:02:31
在我的问题、这个问题和文档这里的注释之后,我使用容器管理的EntityManager和TransactionAttributeType注释解决了这个问题。
导致超时的bean方法现在对处理子任务的不同方法执行多次调用,例如每个方法调用在不同的事务中执行。我使用NOT_SUPPORTED属性类型,因为:
如果客户端与事务没有关联,容器在运行该方法之前不会启动新事务。
使用这种安排,只有较小的processDoc方法才会创建不应该超时的事务。
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
// ...
}
}。
发布于 2014-10-13 15:09:04
使用UserTransaction怎么样?
@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();
}
}https://stackoverflow.com/questions/26341801
复制相似问题