具有长期操作的托管CDI事务

时间:2015-03-21 08:42:01

标签: java-ee cdi jta java-ee-7

假设我有一个需要

的CDI bean
  1. 加载一些JPA实体
  2. 使用该JPA实体进行长时间的IO操作(即调用Web服务)
  3. 使用-2 -
  4. 的结果更新一些JPA实体

    如果我想在IO操作运行时避免长事务,那么最佳模式是什么?我知道我可以在-2-中使用@Transactional(Transactional.TxType.REQUIRES_NEW),但据我所知,在-1-中打开的交易只会暂停。

    直到知道我使用旧的JBoss 4而不是容器管理的事务而且我曾经这样做:

    1. 创建entityManager而不打开新事务
    2. 加载JPA实体(未打开任何交易)
    3. 执行IO操作即(调用外部Web服务)
    4. 打开交易,更新jpa实体,关闭交易
    5. 我知道该模式可能会有一些数据不一致,因为您更新了在事务外部获得的数据,但在某些情况下它可以正常。

      是否有任何模式以管理方式模仿旧的非容器管理事务。如果可以不管理分离的实例?

      修改 对于某些情况,来自@Alexander Langer的回复是一个不错的选择。但是如果有可能的话,我也想知道一个没有工作的替代方案。 因为点-2-(长IO操作)只能是对服务请求所需的外部WS的简单调用。

      通常,持有交易没有任何问题。但是,如果由于某种原因外部WS无法正常工作并且需要花费大量时间来响应,那么如果事务开始累积则这是一个大问题。事实上,在没有事务的情况下保留EntityManager openend并从池中保存数据库连接这一简单事实可能是个问题。

      我知道有超时,但总的来说,我想知道一个可用的模式,以最大限度地减少简单情况下的交易时间。或者,如果不涉及批处理作业,则知道EE7的反模式是否简单。

1 个答案:

答案 0 :(得分:1)

看看Java EE 7中引入的Java EE Batch Processing。它正是您正在寻找的。