2013-02-18 114 views

回答

4

每第N次迭代使用EntityManager.flush()EntityManager.clear(),以便会话与数据库同步,清除chache以防止OOM。

如果您使用Hibernate,则还可以将hibernate.jdbc.batch_size设置为适当的值,以在JDBC级别上进行批处理。

如果您还希望在批处理后坚持使用@Transactional方法,请重构您的代码,以便@Transactional方法从输入源中获取一批N个记录,然后从外部循环中调用该方法。否则,你可以使用Spring的TransactionTemplate通过编程控制研究交易。

这可能是有用的:http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch15.html

+1

谢谢,太棒了。 flush()和clear()+ batch_size做了诀窍。巨大的性能提升。 10分钟后取消之前的尝试,而不到一半的工作完成。现在它在2.5分钟内完成。 – 2013-02-18 13:08:38