我们在一个也有批处理的Web应用程序上 .

我们正面临着表演问题 . 我们正在使用Spring批处理和JPA(使用hibernate实现),但没有使用EJB .

目前我们正在使用 HibernateCursorItemReader 加载数据和 JPAItemWriter 进行更新 .

我正在寻找最佳模式来优化我们的批次 . 我已经看过许多讨论和文档,其中人们没有使用扩展持久化上下文来解决许多问题,例如获取OutOfMemory错误,非线程安全对象......

但在我们的例子中,我们讨论批处理,因此一次只能有一个持久化上下文 . 我们计划在每个块之后刷新并清除 EntityManager ,它将逐个保持项目(提交大小= 1) .

所以我不明白为什么不为阅读器,处理器和编写器只使用一个持久化上下文 . 这个想法是它会避免许多选择(每个项目至少有一个)重新附加读取器和编写器之间的分离项目(这样 EntityManager 可以合并而不进行另一个选择) .

所以我想知道你是否会对这种模式有所建议 .

以及如何正确实现它,因为它不是Spring Batch的defaut行为 . 实际上,我们必须覆盖持久化上下文属性,该属性对于Web应用程序是Transactional,并使用 @PersistenceContext 注释进行注入 .

编辑:我忘了说我们在Tomcat 7服务器上