设为首页 加入收藏

TOP

Hibernate批量更新与删除实例浅析
2014-11-23 20:20:33 】 浏览:7456
Tags:Hibernate 批量 更新 删除 实例 浅析

  在我们的Java项目中,批量更新是指在一个事务中更新大批量数据,批量删除是指在一个事务中删除大批量数据。批量删除虽然在Hibernate里也可以实现,但因 Hibernate的实现机制是一个一个删除,在数量大的情况下很影响效率;其实Hibernate提供的JDBC接口,可以方便的进行批量的更新和删除。


  以下程序直接通过Hibernate API批量更新CUSTOMERS表中年龄大于零的所有记录的AGE字段:


  tx = session.beginTransaction();


  Iterator customers=session.find("from Customer c where c.age>0").iterator();


  while(customers.hasNext()){Customer customer=(Customer)customers.next();


  customer.setAge(customer.getAge()+1);


  }


  tx.commit();


  session.close();


  如果CUSTOMERS表中有1万条年龄大于零的记录,那么Session的find()方法会一下子加载1万个Customer对象到内存。当执行tx.commit()方法时,会清理缓存,Hibernate执行1万条更新CUSTOMERS表的update语句:


  update CUSTOMERS set AGE= …. where ID=i;


  update CUSTOMERS set AGE= …. where ID=j;


  ……


  update CUSTOMERS set AGE= …. where ID=k;


  以上批量更新方式有两个缺点:


  (1)占用大量内存,必须把1万个Customer对象先加载到内存,然后一一更新它们。


  (2)执行的update语句的数目太多,每个update语句只能更新一个Customer对象,必须通过1万条update语句才能更新一万个Customer对象,频繁的访问数据库,会大大降低应用的性能。


  为了迅速释放1万个Customer对象占用的内存,可以在更新每个Customer对象后,就调用Session的evict()方法立即释放它的内存:


  tx = session.beginTransaction();


  Iterator customers=session.find("from Customer c where c.age>0").iterator();


  while(customers.hasNext()){Customer customer=(Customer)customers.next();


  customer.setAge(customer.getAge()+1);


  session.flush();session.evict(customer);


  }


  tx.commit();session.close();


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇提取汉字拼音首字母(Java版) 下一篇快速排序法(Java版)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目