【问题标题】:With Spring Transactions with Hibernate, how can you get 2000+ inserts to not slow down in the same transaction?使用带有 Hibernate 的 Spring Transactions,如何在同一个事务中获得 2000 多个插入而不减慢速度?
【发布时间】:2010-06-29 19:47:03
【问题描述】:

我有一个奇怪的小问题。我有一项服务需要在数据库中创建 2000 条记录,最少在各种表上。虽然让它们在同一个事务中运行会很好,但在 400-600 次插入时性能会变得非常糟糕。

由于某种原因,插入速度越来越慢。我想 Hibernate 需要做一些脏检查……而且随着对象图变得越来越复杂,Hibernate 有越来越多的工作要做。

这真的很糟糕,因为我们有一项服务基本上将 200 兆 XML 数据导入数据库,导致大约 70,000 次插入。运行大约需要 1.5 小时。

所以在 Spring 中,有没有一种方法可以让我说:“保持休眠会话打开,因为我们希望延迟加载和其他东西工作......但不要在事务中放入任何东西?”

【问题讨论】:

    标签: performance hibernate spring transactions


    【解决方案1】:

    您应该阅读以下来自 Hibernate 的 Batch processing documentation。当您在单个事务中执行操作时,它们都是同一个 Hibernate 会话的一部分。在刷新会话之前,您的任何对象都不会持久保存到数据库中,因此它们都保存在内存中。您需要定期刷新会话并清除它。文档提供了很多细节。如果您确实不需要 Hibernate 会话的所有语义,请使用无状态会话接口。

    另外,请确保您使用的是 JDBC 批处理参数。如果您不使用它,那么 Hibernate 将一次将一行写入数据库,而不是批量写入多行。您可能希望根据您的数据库和驱动程序尝试不同的批量大小。

    请记住,Hibernate 在对象跟踪和脏检查方面有很多与之相关的开销。如果调整后的性能不能满足您的要求,您可能需要考虑使用 Hibernate 映射文件来生成原始 SQL,但使用原始 JDBC 插入数据。

    【讨论】:

    • 啊,我知道刷新和会话。我什至尝试过使用 .flush(),但我从来没有使用过 .clear()。这完全解决了它。谢谢!
    猜你喜欢
    • 2021-08-05
    • 2013-11-27
    • 2016-07-08
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多