码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate的批量操作

时间:2017-01-12 18:47:54      阅读:32      评论:0      收藏:0      [点我收藏+]

标签:name   清理   情况   forward   hiberna   sql语句   etc   second   color   

批量插入

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的批量操作

标签:name   清理   情况   forward   hiberna   sql语句   etc   second   color   

(0)
(0)
   
举报
评论 一句话评论(0
0条  
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!