Hibernate批量操作笔记

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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值