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