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

Can you overwrite the batch size set in SessionFactoryOptions?

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

如果你想插入 1000 条记录并配置 batch_size=20 如下。意味着一次性发送 "batch size" 个查询,而不是在代码触发查询时发送每个查询。因此,在这种情况下,将有 1000 个插入查询,每批发送 20 个插入查询 50 次。

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

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

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

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

另一方面,

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

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