随笔-124  评论-194  文章-0  trackbacks-0
这里有个帖子论证HIBERNATE在批量插入时性能下降,以及一些解决方式。

其核心在于批量插入时,积攒一定量后就写库,并清除SESSION里的第一级缓存,以免后续插入操作受缓存查找而影响效率:

if ( j % batchNum2 == 0 ) {//执行物理批量插入
                                   session.flush();
                         session.clear();            

}


基于JPA的事务操作,SESSION不可见,此时,需要直接调用EntityManager的flush和clear。
但EntityManager也是被封装入JpaDaoSupport,实际的EntityManager对象也不容易取得。
此时可以用其JpaTemplate成员的execute方法来实现这两个操作:

        getJpaTemplate().execute(new JpaCallback() {
            
public Object doInJpa(EntityManager em) throws PersistenceException {
                em.flush();
                em.clear();
                
return null;
            }
        }, 
true);

在我这里测试结果:
没有定期调用以上方法时,插入50个记录要2秒,并且随着记录增多,时间越来越长。
每插入50个调用以上方法后,插入50个记录小于300毫秒,且不随记录个数线性增长。
posted on 2009-07-16 21:20 我爱佳娃 阅读(6678) 评论(0)  编辑  收藏 所属分类: Hibernate

只有注册用户登录后才能发表评论。


网站导航: