我们在用数据库时,如果可以批量插入或者更新数据,可以很大地提高使用数据库的性能。但是我在用Hibernate实现批处理的过程中,走了一些弯路。下面我就把我的整个配置过程和经验总结分享,希望可以帮助到后来人。
撰写代码
首先你必须要撰写或者修改你的批处理代码。比如你的目标是通过Hibernate一次保存50个Customer对象,那你必须每save满50个对象,就flush一次,如下:
Transaction tx = session.beginTransaction();
for(Customer customer : customers) {
session.save(customer );
if(++i % 50 == 0) {
session.flush();
session.clear();
}
}
tx.commit();
这是因为Hibernate会把新插入的数据都保存在缓存(persistence context cache)中。因为缓存大小的限制,所以隔一定数量就要flush,否则可能会碰上OutMemorException.
修改配置文件
Hibernate官方指导文档建议,为了最好的性能,应该把hibernate.jdbc.batch_size设置成和代码中procedure batch一样的size,在hibernate.cfg.xml中加上:
<property name="hibernate.jdbc.batch_size">50</property>
这里还有一点要注意的是,记得关掉batch操作的二级缓存。否则的话,每个对象被保存时,都会同时保存到二级缓存,这是一个不必要的浪费。
修改标识符生成器(id generator)
上面两个步骤看起来应该大功告成了,其实离成功还得远。首