Hibernate中大批量处理数据机制
如果我们要保存的数据量十分巨大,海量信息的保存、更新,那么在程序中执行添加、更新方法,如session.save(),Session对象自身开辟的一级缓存会不断消耗,直至内存溢出。因为每save()一个对象都会添加到一级缓存中,数据量太大,绝对会造成内存溢出。那么该怎样解决大批量操作数据呢?
有一种方法就是在每保存指定条数的数据时,先将一级缓存中的数据与数据库同步一下,之后再清空一级缓存,继续保存接下来的数据,依次循环,直至保存完毕。如下代码:
public void savePetInfo()
{
// 创建Session对象
Session session = HibernateSessionFactory.getSession();
// 创建PetInfo对象
PetInfo petInfo = new PetInfo();
petInfo.setPetName("灰太狼");
petInfo.setPetLove(100);
// 批量保存数据
for (int i=0;i<100000;i++)
{
// 保存
session.save(petInfo);
// 当保存50条之后,将缓存中的数据与数据库同步,之后清空一级缓存
if (i%50==0)
{
// 将一级缓存中的数据同步到数据库中
session.flush();
// 清空一级缓存中的数据,这样不至于造成内存溢出
session.clear();
}
}
// 创建Transaction对象
Transaction transaction = session.beginTransaction();
// 提交事务
transaction.commit();
// 关闭session
session.close();
}
实际上Hibernate中为我们处理海量信息的操作提供了解决办法,通过StatelessSession接口实现,该接口是一个无状态接口,它不和一级缓存、二级缓存交互,也不出发任何事件、监听器、拦截器,通过该接口的操作会立即发送给数据库,与JDBC功能一样, StatelessSession session = sessionFactory.openStatelessSession();
还有一种方法进行批量操作就是利用Query对象的executeUpdate()方法执行批量更新、删除、增加,它会清除相关联类的二级缓存(利用:sessionFactory.Evict(Class clz)),但是这样会造成级联和乐观锁定出现问题。