Hibernate的批量操作
Posted 云中之歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate的批量操作相关的知识,希望对你有一定的参考价值。
批量插入
Hibernate强制开启了一级缓存,缓存空间是有限的,如果批量操作的SQL语句太多,就会运行失败(内存溢出),
因此在批量操作的时候,每执行一批SQL语句,都需要刷新缓存,例如下面这样,每执行20条SQL,刷新一次缓存。
1 for (int i = 0; i < 10000; i++) { 2 User u = new User("张三", 20, "中国广州"); 3 sess.save(u); 4 if (i % 20 == 0) { 5 sess.flush(); 6 sess.clear(); 7 } 8 }
除了对session级别的缓存进行清理,hibernate还建议如下配置来关闭SessionFactory的二级缓存
hibernate.cache.use_second_level_cache false
批量更新
与批量插入一样,都需要清空一级缓存。
在更新数据前,需要先查出数据,用scroll()方法查出数据,可以使用游标带来的性能优势(next()方法).
例如下面这样,
1 ScrollableResults users = sess.createQuery("from User") 2 .setCacheMode(CacheMode.IGNORE) 3 .scroll(ScrollMode.FORWARD_ONLY); 4 int count = 0; 5 while (users.next()) { 6 User u = (User) users.get(0); 7 u.setName("新用户名"+count); 8 if (++count % 20 == 0) { 9 sess.flush(); 10 sess.clear(); 11 } 12 }
上面是逐行更新,适合每行要更新成不同值的情况。这种更新速度会很慢,下面这种更新则是真正的批量更新,查询和更新都使用同一条语句,适用于所有行都更新成相同值。
DML风格的批量更新
1 String hqlUpdate = "Update User u set name = :newName"; 2 int updateEntities = sess.createQuery(hqlUpdate) 3 .setString("newName", "新名字") 4 .executeUpdate();
DML风格的批量删除
1 String hqlUpdate = "delete User"; 2 //返回最后一条SQL语句影响的行数 3 int updateEntities = sess.createQuery(hqlUpdate) 4 .executeUpdate();
DML风格的操作性能明显比前面的好,但是在更新的时候貌似只能把所有行更新成相同值,在删除的时候只能返回最后一个SQL所影响的行数。
以上是关于Hibernate的批量操作的主要内容,如果未能解决你的问题,请参考以下文章