zoukankan      html  css  js  c++  java
  • 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所影响的行数。

  • 相关阅读:
    window.top.location
    JS 退出系统并跳转到登录界面的实现代码
    CSS position 属性
    在网页中插入时间 自动更新
    CKeditor 配置使用
    使用JspSmart文件上传
    复制的web工程为什么不能部署到tomcat
    JDBC 4 PreparedStatement 与Statement 的区别
    每周会商自动化
    晚上的亲子时光
  • 原文地址:https://www.cnblogs.com/fysola/p/6279215.html
Copyright © 2011-2022 走看看