我们在一个也有批处理的Web应用程序上 .
我们正面临着表演问题 . 我们正在使用Spring批处理和JPA(使用hibernate实现),但没有使用EJB .
目前我们正在使用 HibernateCursorItemReader
加载数据和 JPAItemWriter
进行更新 .
我正在寻找最佳模式来优化我们的批次 . 我已经看过许多讨论和文档,其中人们没有使用扩展持久化上下文来解决许多问题,例如获取OutOfMemory错误,非线程安全对象......
但在我们的例子中,我们讨论批处理,因此一次只能有一个持久化上下文 . 我们计划在每个块之后刷新并清除 EntityManager
,它将逐个保持项目(提交大小= 1) .
所以我不明白为什么不为阅读器,处理器和编写器只使用一个持久化上下文 . 这个想法是它会避免许多选择(每个项目至少有一个)重新附加读取器和编写器之间的分离项目(这样 EntityManager
可以合并而不进行另一个选择) .
所以我想知道你是否会对这种模式有所建议 .
以及如何正确实现它,因为它不是Spring Batch的defaut行为 . 实际上,我们必须覆盖持久化上下文属性,该属性对于Web应用程序是Transactional,并使用 @PersistenceContext
注释进行注入 .
编辑:我忘了说我们在Tomcat 7服务器上