浏览hibernate https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html的批处理文档。我尝试了一个示例在hibernate配置文件中设置批量大小属性( hibernate.jdbc.batch_size = 20 ),然后执行flush和clear,如:
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。
答案 0 :(得分:1)
我的理解是你的循环和hibernate.jdbc.batch_size
在不同的层面上运作。
您的循环对实体(您选择的)进行操作。但是,单个客户可能需要多个插入(例如,当客户有多个地址时)。
使用循环方法将所有这些插入执行为简单的单个插入。 flush
和clear
只会阻止会话无限制地增长。
hibernate.jdbc.batch_size
将相同且仅在参数值中不同的bundle(insert)语句捆绑到单个语句中,并带有参数集列表。数据库和等效的单个语句应该更有效地处理这种批处理语句的执行。