进行批量更新时,如果一下子把所有对象加载到session的缓存中,然后再进缓存中一一更新它们,显然是不可取的,为了解决这一问题,可以使用滚动的结果集
org.hibernate.ScrollableResults,Query的 scroll()方法返回一个ScrollableResults对象。以下是示例,该代码一开始利用ScrollableResults对象来家在所有的Customer
</pre><p><pre name="code" class="java">
对象
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
ScrollableResults customers = session.createQuery("from Customer").scroll(ScrollMode.FORWARD_ONLY);
int count = 0;
while(customers.next()){
Customer customer = (Customer)customers.get(0);
customer.setAge(customer.getAge()+1);
if(++count%20==0){ //单次操作数目为20条
session.flush(); //清理缓存,执行批量更新20条记录的SQL update语句
session.clear();//清空缓存中的Customer对象
}
}
tx.commit();
session.close();
</pre>在以上代码中,Query的scroll()方法返回的ScrollableResults对象中实际上并不包括任何Customer对象,它仅包含用于在线定位数据库中CUSTOMERS记录的游标。</p><p>只有当程序遍历访问ScrollableResults对象中的特定元素时,它才会到数据库中加载相应的Customer对象。</p><p>为了保证以上程序顺利运行,需要遵守一下约束:</p><p>1.在Hibernate的配置文件中,应该把hibernate.jdbc.batch_size属性也设为20。</p><p>2.关闭第二级缓存,假如已经在配置文件中启用了第二级缓存,也可以通过以下方式在程序中hulve第二级缓存:</p><p><pre name="code" class="java">ScrollableResults customers = session.createQuery("from Customer").setCacheMode(CacheMode.IGNORE).scroll(ScrollMode.FORWORD_ONLY);
本文介绍了一种使用Hibernate框架进行批量更新的高效方法。通过利用ScrollableResults接口和设置合适的缓存清理策略,可以在不消耗大量内存的情况下,实现对数据库中大量记录的逐条更新。
313

被折叠的 条评论
为什么被折叠?



