批量插入

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所影响的行数。

转载于:https://www.cnblogs.com/fysola/p/6279215.html

Hibernate的批量操作相关推荐

  1. hibernate批量查询_使用Hibernate批量获取

    hibernate批量查询 如果需要从Java处理大型数据库结果集,则可以选择JDBC,以提供所需的低级控制. 另一方面,如果您已在应用程序中使用ORM,则回退到JDBC可能会带来一些额外的麻烦. 在 ...

  2. 使用Hibernate批量获取

    如果需要从Java处理大型数据库结果集,则可以选择JDBC,以提供所需的低级控制. 另一方面,如果您已在应用程序中使用ORM,则回退到JDBC可能意味着额外的麻烦. 在域模型中导航时,您将失去乐观锁定 ...

  3. mysql执行非查询语句_iBatis执行非查询语句(CRUD,函数和过程)

    insert into users(USERNAME,PASSWORD,AGE,MOBILE,EMAIL) values(#userName:VARCHAR#,#password:VARCHAR#,# ...

  4. 浅谈Hibernate批量操作

    在正式地介绍hibernate批量操作之前,先给大家普及一个hibernate重要的成员,即hibernate一级缓存,这个一级缓存不像二级缓存那样可插拔似的,是无条件使用的,这个缓存最大的一个作用就 ...

  5. (4) hibernate增删查改+批量操作+类似Mybatis动态sql

    简介 采用spring + hibernate + freemaker+ maven搭建起来的一个hibernate增删查改和 类似mybatis动态sql查询的一个案例 增删查改demo + 动态s ...

  6. Spring Hibernate JPA 联表查询 复杂查询

    (转自:http://www.cnblogs.com/jiangxiaoyaoblog/p/5635152.html) 今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的 ...

  7. 在Hibernate中处理批量更新和批量删除

    批量更新是指在一个事务中更新大批量数据,批量删除是指在一个事务中删除大批量数据.以下程序直接通过Hibernate API批量更新CUSTOMERS表中年龄大于零的所有记录的AGE字段: 如果CUST ...

  8. hibernate.cfg.xml详细配置

    <!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式-->                  <? ...

  9. Oracle总结第二篇【视图、索引、事务、用户权限、批量操作】

    前言 在Oracle总结的第一篇中,我们已经总结了一些常用的SQL相关的知识点了-那么本篇主要总结关于Oralce视图.序列.事务的一些内容- 在数据库中,我们可以把各种的SQL语句分为四大类- (1 ...

最新文章

  1. Corn Fields(POJ 3254状压dp)
  2. Qt Designer下的一些基础操作
  3. mysql查询每个id的前10条数据_解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据...
  4. MacOS中Nginx的安装「借助Homebrew」
  5. Jelinek-Merer与Absolute discounting 平滑方法
  6. 信息学奥赛一本通 1314:【例3.6】过河卒(Noip2002) | 1921:【02NOIP普及组】过河卒 | 洛谷 P1002 [NOIP2002 普及组] 过河卒
  7. 微模式重金招聘高级图像算法工程师
  8. STM32 输入捕获功能
  9. 计算机视觉图像去噪原理,AI笔记: 计算机视觉之图像滤波去噪: 原理、方法和效果比较...
  10. Shell子程序结构,函数
  11. 御剑情缘服务器维护吗,御剑情缘更新后登不上怎么回事 1月11日更新后进不去解决方法...
  12. 关于网页数据导入excel
  13. 《金字塔原理》要点汇总
  14. 在MacOS下为2K显示器开启HiDPI
  15. Html中所有的a标签点击打开新的窗口
  16. LabVIEW编程运动控制PID入门
  17. 国家AAAAA级旅游景区数量统计
  18. 关于gb2312编码的xml解析
  19. API电商平台获取淘宝商品详情
  20. SACC2018:微服务架构设计

热门文章

  1. 加密算法—MD5、RSA、DES
  2. [LeetCode] #22 Generate Parentheses
  3. Web API核查表:设计、测试、发布API时需思考的43件事
  4. poj 2886Who Gets the Most Candies?
  5. angularjs 上传
  6. axios异步请求数据的简单使用
  7. 让物联网真正起飞的关键:无线充电
  8. Java解析Rss(三)
  9. python (3):wxPython打包app,报错
  10. linq to sql报错,