【问题标题】:Managed CDI transaction with long operations具有长操作的托管 CDI 事务
【发布时间】:2015-03-21 08:42:01
【问题描述】:

假设我有一个需要的 CDI bean

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

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

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

  1. 在不打开新事务的情况下创建 entityManager
  2. 加载 JPA 实体(未打开事务)
  3. 做IO操作,即(调用外部Webservice)
  4. 打开事务,更新 jpa 实体,关闭事务

我知道该模式可能存在一些数据不一致,因为您更新了在事务之外获得的数据,但在某些情况下可能没问题。

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

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

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

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

【问题讨论】:

  • 可以使用乐观锁吗?这将与您上面提到的 JBoss 选项类似,但不会出现数据不一致......但代价是必须重试某些事务。

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


【解决方案1】:

看看 Java EE 7 中引入的Java EE Batch Processing。它正是您要找的。​​p>

【讨论】:

  • 对于某些用例来说这是一个不错的选择。但是当 -2- 是对外部服务的简单同步调用时,我会喜欢另一种选择(请参阅我的编辑)。
猜你喜欢
  • 2011-06-19
  • 2017-01-15
  • 1970-01-01
  • 2010-11-14
  • 2012-12-19
  • 2012-05-19
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
相关资源
最近更新 更多