1、批量插入
大量记录插入数据库有两种处理方式:通过Hibernate缓存、绕过Hibernate直接调用JDBC API。
(1)hibernate缓存
private void testBatchAddByCache(){
Session session=null;
Transaction tx=null;
try{
session=HibernateSessionFactory.getSession();
tx=session.beginTransaction();
for(int i=0;i<1000000;i++){
Users user=new Users();
user.setLoginName("u"+i);
session.save(user);
}
tx.commit();
```
}
}
运行测试,程序会在某个时候运行失败,并抛出OutofMemoryError
Hibernate缓存分为一级缓存和二级缓存,hibernate对两种缓存有不同的管理机制,对于二级缓存,可以对它大小进行相关设置,对于一级缓存,hibernate对它的容量没有限制。由于Hibernate的Session持有一个必选的一级缓存,执行海量数据插入时,所有的Users对象都被纳入一级缓存,这样内存就会一点一点被占用,直到内存溢出。
要解决问题,需要定时将Session缓存的数据刷入数据库,而不是一直在Session级别缓存
步骤:设置批量尺寸:在Hibernate配置文件hibernate.cfg.xml中设置hibernate.jdbc.batch_size属性<property name="hibernate.jdbc.batch_size">100</property>
关闭二级缓存,如果启用,hibernate为了维护二级缓存,批量插入时,hibernate会将Users对象纳入二级缓存,性能上会有很大损失,也可能发生异常。
在hibernate.cfg.xml中<property name="hibernate.cache.use_second_level_cache">false</property>
清空Session级别的一级缓存
testBatchAddByCache()方法中,添加:if(i%100==0){session.flush();