Transactions Java批处理事务控制

Transactions Java批处理事务控制,transactions,cdi,jberet,Transactions,Cdi,Jberet,我有一些代码用于运行bean管理的事务(我的代码将处理何时启动或提交事务)。该代码被迁移到容器管理的事务中,并最终从Java批处理(Wildfly中的JSR-352)中使用 随着我们处理的数据量的增加,我们看到了与事务相关的问题。在各种情况下,甚至查询都会失败,并且异常指示事务仅标记为回滚。因此,我假设在之前的迁移过程中一定发生了一些错误 我仍然希望使用容器管理的事务,但是 如何在batchlet中正确使用CDI,使其接收EntityManager?我是使用@PersistenceContex

我有一些代码用于运行bean管理的事务(我的代码将处理何时启动或提交事务)。该代码被迁移到容器管理的事务中,并最终从Java批处理(Wildfly中的JSR-352)中使用

随着我们处理的数据量的增加,我们看到了与事务相关的问题。在各种情况下,甚至查询都会失败,并且异常指示事务仅标记为回滚。因此,我假设在之前的迁移过程中一定发生了一些错误

我仍然希望使用容器管理的事务,但是

  • 如何在batchlet中正确使用CDI,使其接收EntityManager?我是使用@PersistenceContext、@PersistenceUnit还是@Inject注释,还是组合使用
  • 如何使用合理的CDI范围?观察它的发生有三个作用域:作业、步骤和分区。由于batchlet运行时间太长,我可能需要分区作用域,但是batchlet如何控制分区呢
  • 我了解到阅读器/处理器/写入器模式控制事务ootb以获取大量记录。这种模式是否适用于读取记录、处理记录然后立即更新或删除记录的代码
您可以查看,其中包含一些混合批处理、CDI和JPA的有用示例,包括使用
@Inject
注入持久上下文

对于在JBeret中使用各种CDI作用域,这取决于您的特定用例。对于大多数批处理应用程序,他们可能不需要担心它。但是如果您确实发现自己需要控制某些CDIBean的范围,那么请选择最适合这些bean的预期生命周期的范围


如果您想在item writer中立即更新或删除它,您可以选择
item count
of 1。这是可行的,但效率较低。

与此同时,我发现了这个问题,类似于我发布了一个模糊的问题,我现在可以看到,我的问题的答案并不容易得出结论

我的代码过去在没有容器的情况下运行,所以很明显它自己管理它的事务。后来添加了一个容器,最终我开始编写使用容器管理事务的代码。但是只有一个持久性单元,并且它被配置为容器管理的事务。在数据集增长之前的很长一段时间内,这似乎都不是问题

我的解决方案是有两个持久性单元——一个有容器管理的事务,一个没有容器管理的事务:一个是本地资源,另一个是JTA。
我的代码需要使用正确的持久性单元,以便正确管理事务。

谢谢您的建议。这次问题根本不在JBatch上,因为我的batchlet可以很好地控制事务。然而,持久化单元是为JTA配置的,这意味着容器也试图控制事务。JPA规范在明确存在两种“模式”方面总是做得很差:“应用程序模式”JPA(在这里,您可以调用
持久性等东西#createEntityManagerFactory()
并管理您自己的事务),以及“容器模式”JPA(通过
@PersistenceContext
插入
EntityManager
后,将应用非常特定的事务相关规则)。