spring-data JPA:手动提交事务并重新启动新事务

beg*_*er_ 4 transactions spring-data

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

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

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

zag*_*gyi 5

在每个第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