通过显式调用 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
在不同的级别上运行。
您的循环对实体(您选择的)进行操作。但是单个客户可能需要多次插入(例如,当客户有多个地址时)。
所有这些插入都通过循环方法作为简单的单个插入执行。 flush
和 clear
只是阻止会话无限制地增长。
另一方面,hibernate.jdbc.batch_size
会将相同且仅参数值不同的语句捆绑(插入)到单个语句中,并带有参数集列表。数据库应该比等效的单个语句更有效地处理这种批处理语句的执行。
查看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
在不同的级别上运行。
您的循环对实体(您选择的)进行操作。但是单个客户可能需要多次插入(例如,当客户有多个地址时)。
所有这些插入都通过循环方法作为简单的单个插入执行。 flush
和 clear
只是阻止会话无限制地增长。
hibernate.jdbc.batch_size
会将相同且仅参数值不同的语句捆绑(插入)到单个语句中,并带有参数集列表。数据库应该比等效的单个语句更有效地处理这种批处理语句的执行。