0
|
John · 技术社区 · 10 年前 |
![]() |
1
0
解决方案是按照@JoshuaMoore的建议,使用新的会话。此外,还有一个对域对象的引用,该对象是从一个事务外部引用的,而该事务在新会话中没有调用merge(),从而导致错误。 即
Joshua的评论促使我深入了解Hibernate的文档( https://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/transactions.html ) 具体而言,从第13章:
其他人可能感兴趣的是,随着解析对象数量的增加,我看到批处理加载的性能逐渐下降,即使Burt Beckwith建议进行性能优化 here :并由Ted Naleid进一步详细解释 here . 因此,使用文档中的提示,性能问题的答案不是尝试在所有处理中使用会话,而是使用它进行少量处理,然后丢弃它并创建一个新的会话。 当我删除问题中的cleanupGorm()方法并用以下方法替换它时,我得到了 性能提高6倍 ,即使在解析了数以千万计的记录之后,加载时间也不会随批处理大小而增加:
当我需要在跨越服务的事务中包装东西时,我做了以下操作:
虽然我承认使用SpringBatch这样的东西可能更好,但这可能会涉及丢弃大量代码,否则这些代码将按预期工作。我将在下一次需要这样做时研究这一点,但同时,希望这可能对其他需要使用Grails进行大规模批处理的人有用,并且发现批处理大小会导致性能下降。 约书亚注意:非常感谢你的帮助,非常感谢! |