【问题标题】:spring-data JPA: manual commit transaction and restart new onespring-data JPA:手动提交事务并重新启动新事务
【发布时间】:2013-02-18 20:44:09
【问题描述】:

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

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

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

【问题讨论】:

    标签: transactions spring-data


    【解决方案1】:

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

    【讨论】:

    • 谢谢,太好了。 flush() 和 clear() + batch_size 成功了。性能大幅提升。 10 分钟后取消之前的尝试,而完成的工作不到一半。现在它在 2.5 分钟内完成。
    猜你喜欢
    • 2019-11-25
    • 2013-05-01
    • 1970-01-01
    • 2013-09-13
    • 2011-03-03
    • 2015-09-22
    • 2016-10-23
    • 2015-12-17
    • 2017-06-17
    相关资源
    最近更新 更多