Transactions spring数据JPA:手动提交事务并重新启动新事务

Transactions spring数据JPA:手动提交事务并重新启动新事务,transactions,spring-data,Transactions,Spring Data,我有一个导入数据的方法。如果导入量很大,则无法在单个事务中运行,否则可能会由于巨大的事务语句缓存而导致OutOfMemoryError 我想要的是在语句缓存中的n条记录之后手动提交 我怎样才能做到这一点?(最好在@Transactional方法中)。在每第n次迭代中使用EntityManager.flush()和EntityManager.clear(),以便会话与数据库同步,并清除检查以防止OOM 如果使用Hibernate,还可以将Hibernate.jdbc.batch\u size设置为

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

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


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

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

如果使用Hibernate,还可以将
Hibernate.jdbc.batch\u size
设置为适当的值,以便在jdbc级别进行批处理

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

这可能很有用:

谢谢,太好了。flush()和clear()+批量大小完成了这一任务。性能大幅提升。10分钟后取消了以前的尝试,但完成的工作不足一半。现在它在2.5分钟内完成。