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