通过显式调用 session.flush() 设置 Hibernate 属性 hibernate.jdbc.batch_size

Setting Hibernate property hibernate.jdbc.batch_size over explicitly calling session.flush()

查看hibernate的批处理文档https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html。我尝试了一个示例,在休眠配置文件中设置批处理大小 属性(hibernate.jdbc.batch_size=20),然后像这样刷新和清除:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();

现在的问题是,如果我将 i 的值设置为 50,那么它会将记录作为一批 50 条刷新。所以,如果我可以在循环中控制批大小,为什么我需要设置hibernate.jdbc.batch_size 20 属性.

有人可以解释一下这两种方法之间的区别,即设置 属性 而不是显式调用 flush。

我的理解是您的循环和 hibernate.jdbc.batch_size 在不同的级别上运行。

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

另一方面,

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