4

我有一种导入数据的方法。如果导入很大,它不能在单个事务中运行而不会由于巨大的事务语句缓存而导致 OutOfMemoryError。

我想要的是在语句缓存中的 n 条记录之后手动提交。

我怎样才能做到这一点?(最好在 @Transactional 方法中)。

4

1 回答 1

5

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

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

如果您还想在批处理后提交并坚持使用 @Transactional 方法,则重构您的代码,以便 @Transactional 方法从输入源获取一批 N 记录,并从外部循环调用该方法。否则,您可以使用 SpringTransactionTemplate以编程方式控制事务。

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

于 2013-02-18T12:33:18.610 回答