【问题标题】:Can you overwrite the batch size set in SessionFactoryOptions?你能覆盖在 SessionFactoryOptions 中设置的批量大小吗?
【发布时间】:2019-06-18 22:55:57
【问题描述】:

考虑下面的代码,这会覆盖为 sessionFactory 配置的 batch_size 为 25,还是会因为 batch_size 配置与代码不匹配而产生冲突?

//this prints: "Config batch_size: 100"
System.out.println("Config batch_size: "+sessionFactory.getSessionFactoryOptions().getJdbcBatchSize());
int batchSize = 25;
int batchCount = 0;
Session session = sessionFactory.getCurrentSession();
for (Users user : users) {
    session.update(user);
    batchCount++;
    if (batchCount % batchSize == 0) {
        session.flush();
        session.clear();
    }
}

【问题讨论】:

    标签: java hibernate sessionfactory


    【解决方案1】:

    如果您想插入 1000 条记录并配置 batch_size=20,如下所示。意味着一次性发送“批量大小”数量的查询,而不是在代码触发查询时发送每个查询。因此在这种情况下,将有 1000 个插入查询,发送 50 次,每批 20 个插入查询。

    属性名称="hibernate.jdbc.batch_size" value="20"

    将记录器 org.hibernate.engine.jdbc.batch.internal.BatchingBatch 放入级别调试。 在插入顺序错误的情况下,hibernate 可以生成大小为 1,2 或 3 的批次。 尝试使用 hibernate.order_inserts=true hibernate.order_updates=true

    【讨论】:

    • 我知道如何设置 batch_size 属性。我将批量大小配置为“hibernate.jdbc.batch_size”值=“100”。我的问题是,如果我将 batch_size 配置为 100,但我实现上述代码以每 25 次插入刷新/清除,会发生什么情况?它会一次发送 100 个查询(根据配置)还是一次发送 25 个查询(根据代码)?
    • 我已经发布了新的答案。希望它可以消除你的困惑。
    【解决方案2】:

    您实现的循环和 hibernate.jdbc.batch_size 在不同级别上运行。

    您的循环对(您选择的)实体进行操作。但是单个用户可能需要多次插入(例如,当一个用户有多个地址时)。 所有这些插入都通过您的循环方法作为(25 次插入)单次插入执行。 刷新和清除只是防止会话无限制地增长。

    另一方面,hibernate.jdbc.batch_size 将捆绑(插入)相同且仅不同的语句 in 将参数值放入单个语句中,并带有参数集列表。 这种批处理语句的执行应该由数据库更有效地处理 然后是等效的单个语句。

    它将一次发送 25 个查询(按照代码),并且 一次发送 100 个查询(根据配置),但在不同级别。 我希望有意义。

    【讨论】:

    • 完美,这正是我想要理解的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 2016-11-30
    • 2022-11-25
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    相关资源
    最近更新 更多