【发布时间】:2015-03-21 08:42:01
【问题描述】:
假设我有一个需要的 CDI bean
- 加载一些 JPA 实体
- 使用该 JPA 实体执行长 IO 操作(即调用 Web 服务)
- 使用 -2- 的结果更新一些 JPA 实体
如果我想在 IO 操作运行时避免长时间事务,最好的模式是什么?我知道我可以在 -2- 中使用 @Transactional(Transactional.TxType.REQUIRES_NEW) 但据我了解,在 -1- 中打开的事务只会暂停。
直到知道我使用旧的 JBoss 4 和非容器管理的事务并且我曾经这样做:
- 在不打开新事务的情况下创建 entityManager
- 加载 JPA 实体(未打开事务)
- 做IO操作,即(调用外部Webservice)
- 打开事务,更新 jpa 实体,关闭事务
我知道该模式可能存在一些数据不一致,因为您更新了在事务之外获得的数据,但在某些情况下可能没问题。
是否有任何模式可以以托管方式模仿旧的非容器托管事务。如果可以不管理分离的实例?
编辑 在某些情况下,来自@Alexander Langer 的回复是一个不错的选择。但如果可能的话,我也想知道一个没有工作的替代方案。 因为点 -2-(长 IO 操作)只能是对服务请求所需的外部 WS 的简单调用。
通常情况下,持有交易不会有任何问题。但是如果由于某种原因外部 WS 不能正常工作并且需要花费大量时间来响应,那么如果事务开始累积,这将是一个大问题。事实上,在没有事务的情况下维护 EntityManager openend 并从池中保持数据库连接是一个简单的事实。
我知道有超时,但总的来说,我想知道一种可用的模式,以最大限度地减少简单情况下的事务时间。或者知道如果不涉及批处理作业,它是否是 EE7 的简单反模式。
【问题讨论】:
-
可以使用乐观锁吗?这将与您上面提到的 JBoss 选项类似,但不会出现数据不一致......但代价是必须重试某些事务。
标签: jakarta-ee cdi jta java-ee-7