您可以覆盖在SessionFactoryOptions中设置的批量大小吗?

时间:2019-01-25 05:51:46

标签: java hibernate sessionfactory

考虑以下代码,这是否会将为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();
    }
}

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

属性名称=“ hibernate.jdbc.batch_size”值=“ 20”

将记录器org.hibernate.engine.jdbc.batch.internal.Batching批量调试。 如果插入顺序错误,hibernate可以生成大小为1,2或3的批处理。 尝试使用hibernate.order_inserts = true hibernate.order_updates = true