【发布时间】:2013-02-18 20:44:09
【问题描述】:
我有一个导入数据的方法。如果导入量很大,它不能在单个事务中运行而不会由于庞大的事务语句缓存而导致 OutOfMemoryError。
我想要的是在语句缓存中的 n 条记录之后手动提交。
我怎样才能做到这一点? (最好在@Transactional 方法中)。
【问题讨论】:
我有一个导入数据的方法。如果导入量很大,它不能在单个事务中运行而不会由于庞大的事务语句缓存而导致 OutOfMemoryError。
我想要的是在语句缓存中的 n 条记录之后手动提交。
我怎样才能做到这一点? (最好在@Transactional 方法中)。
【问题讨论】:
在每 N 次迭代中使用 EntityManager.flush() 和 EntityManager.clear(),以便会话同步到数据库,并清除缓存以防止 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
【讨论】: