Java批量交易控制
Java Batch Transaction Control
我有一些代码用于 运行 bean 管理的事务(我的代码将处理何时开始或提交事务)。此代码已迁移到容器管理的事务,并最终在 Java Batch(Wildfly 中的 JSR-352)中使用。
现在我们处理的数据量在增长,我们看到了与事务相关的问题。在各种情况下,即使查询失败,异常也表明事务被标记为只回滚。所以我假设之前的迁移过程中一定发生了一些错误。
我仍然想使用容器管理的事务,但是...
- 如何在 batchlet 中正确使用 CDI 以接收 EntityManager?我是使用@PersistenceContext、@PersistenceUnit 还是@Inject 注释,还是组合使用?
- 如何使用合理的 CDI 作用域?查看 https://github.com/jberet/jberet-user-guide/blob/master/custom_cdi_scopes/README.md 它出现在三个范围内:Job、Step 和 Partition。由于 batchlet 我有 运行s 太久了,我可能需要分区范围但 batchlet 将如何控制分区?
- 我了解到 reader/processor/writer 模式控制大量记录的事务 ootb。该模式是否适用于读取记录、处理记录然后立即更新或删除记录的代码?
您查看 WildFly Quickstart for batch processing,其中包含一些混合批处理、CDI 和 JPA 的有用示例,包括使用 @Inject
注入持久上下文。
对于 JBeret 的各种 CDI 范围的使用,这取决于您的具体用例。对于大多数批处理应用程序,他们可能不需要担心。但是,如果您确实发现自己需要控制某些 CDI bean 的范围,则选择最符合 bean 预期生命周期的范围。
如果你想在你的item writer中立即更新或删除它,你当然可以选择item-count
of 1。这是可行的,但效率会降低。
与此同时,我发现了这个问题,并且与我发布一个模糊的问题类似,我现在可以看到我的问题的答案并不容易得出结论。
我的代码以前 运行 没有容器,所以显然它自己管理事务。后来添加了一个容器,最终我开始编写使用容器管理事务的代码。但是只有一个持久化单元,而且它是为容器管理的事务配置的。在数据集增长之前,这似乎很长一段时间都没有问题。
我的解决方案是拥有两个持久性单元——一个有容器管理事务,一个没有容器管理事务:一个是本地资源,另一个是 JTA。
我的代码需要使用正确的持久性单元,以便正确管理事务。
我有一些代码用于 运行 bean 管理的事务(我的代码将处理何时开始或提交事务)。此代码已迁移到容器管理的事务,并最终在 Java Batch(Wildfly 中的 JSR-352)中使用。
现在我们处理的数据量在增长,我们看到了与事务相关的问题。在各种情况下,即使查询失败,异常也表明事务被标记为只回滚。所以我假设之前的迁移过程中一定发生了一些错误。
我仍然想使用容器管理的事务,但是...
- 如何在 batchlet 中正确使用 CDI 以接收 EntityManager?我是使用@PersistenceContext、@PersistenceUnit 还是@Inject 注释,还是组合使用?
- 如何使用合理的 CDI 作用域?查看 https://github.com/jberet/jberet-user-guide/blob/master/custom_cdi_scopes/README.md 它出现在三个范围内:Job、Step 和 Partition。由于 batchlet 我有 运行s 太久了,我可能需要分区范围但 batchlet 将如何控制分区?
- 我了解到 reader/processor/writer 模式控制大量记录的事务 ootb。该模式是否适用于读取记录、处理记录然后立即更新或删除记录的代码?
您查看 WildFly Quickstart for batch processing,其中包含一些混合批处理、CDI 和 JPA 的有用示例,包括使用 @Inject
注入持久上下文。
对于 JBeret 的各种 CDI 范围的使用,这取决于您的具体用例。对于大多数批处理应用程序,他们可能不需要担心。但是,如果您确实发现自己需要控制某些 CDI bean 的范围,则选择最符合 bean 预期生命周期的范围。
如果你想在你的item writer中立即更新或删除它,你当然可以选择item-count
of 1。这是可行的,但效率会降低。
与此同时,我发现了这个问题,并且与我发布一个模糊的问题类似,我现在可以看到我的问题的答案并不容易得出结论。
我的代码以前 运行 没有容器,所以显然它自己管理事务。后来添加了一个容器,最终我开始编写使用容器管理事务的代码。但是只有一个持久化单元,而且它是为容器管理的事务配置的。在数据集增长之前,这似乎很长一段时间都没有问题。
我的解决方案是拥有两个持久性单元——一个有容器管理事务,一个没有容器管理事务:一个是本地资源,另一个是 JTA。 我的代码需要使用正确的持久性单元,以便正确管理事务。