Focuse的空间

我们一直在努力....

hiberante 实现批量导入数据时考虑session 二级缓存的处理

标签: session 二级缓存

hebinate 批量插入时候出现的内存溢出现象。

从hebinate 的官方文档里面我们可以看到这样的一批量导入的记录的实例

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for(int i=0;i<10000;i++){
Customer customer = new Customer(.....);
session.save(customer);

}
tx.commit();
session.close();
这段程序大概运行到 50 000 条记录左右会失败并抛出 内存溢出异常(OutOfMemoryException) 。 这是因为 Hibernate 把所有新插入的 客户(Customer)实例在 session级别的缓存区进行了缓存的缘故。
 

13.1. 批量插入(Batch inserts)

如果要将很多对象持久化,你必须通过经常的调用 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 //20,与JDBC批量设置相同
        //flush a batch of inserts and release memory:
        //将本批插入的对象立即写入数据库并释放内存
        session.flush();
        session.clear();
    }
}
tx.commit();
session.close();

在项目开发的批量级导入时,我遇到这样的问题,因为 session二级缓存的clear(),和flush()方法导致无法正常导入,所以必须实行hibernate 抓取策略。


    评分: 请先登录再投票,同一篇博客一月只能投票一次!
    无人投票

相关博客:


评论


发表评论

最近访客
关注此文的人们还关注