`

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)),但是这样会造成级联和乐观锁定出现问题。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics