4
我有導入數據的方法。如果進口大單交易中沒有可能導致OutOfMemoryError而由於巨大的交易語句緩存就無法運行。彈簧數據的JPA:手動提交事務,並重新啓動新的
我要的是後語句緩存n個記錄手動提交。
我怎樣才能做到這一點? (最好在@Transactional方法中)。
我有導入數據的方法。如果進口大單交易中沒有可能導致OutOfMemoryError而由於巨大的交易語句緩存就無法運行。彈簧數據的JPA:手動提交事務,並重新啓動新的
我要的是後語句緩存n個記錄手動提交。
我怎樣才能做到這一點? (最好在@Transactional方法中)。
每第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
謝謝,太棒了。 flush()和clear()+ batch_size做了訣竅。巨大的性能提升。 10分鐘後取消之前的嘗試,而不到一半的工作完成。現在它在2.5分鐘內完成。 – 2013-02-18 13:08:38