2013-02-18 113 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