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所影响的行数。
转载于:https://www.cnblogs.com/fysola/p/6279215.html
Hibernate的批量操作相关推荐
- hibernate批量查询_使用Hibernate批量获取
hibernate批量查询 如果需要从Java处理大型数据库结果集,则可以选择JDBC,以提供所需的低级控制. 另一方面,如果您已在应用程序中使用ORM,则回退到JDBC可能会带来一些额外的麻烦. 在 ...
- 使用Hibernate批量获取
如果需要从Java处理大型数据库结果集,则可以选择JDBC,以提供所需的低级控制. 另一方面,如果您已在应用程序中使用ORM,则回退到JDBC可能意味着额外的麻烦. 在域模型中导航时,您将失去乐观锁定 ...
- mysql执行非查询语句_iBatis执行非查询语句(CRUD,函数和过程)
insert into users(USERNAME,PASSWORD,AGE,MOBILE,EMAIL) values(#userName:VARCHAR#,#password:VARCHAR#,# ...
- 浅谈Hibernate批量操作
在正式地介绍hibernate批量操作之前,先给大家普及一个hibernate重要的成员,即hibernate一级缓存,这个一级缓存不像二级缓存那样可插拔似的,是无条件使用的,这个缓存最大的一个作用就 ...
- (4) hibernate增删查改+批量操作+类似Mybatis动态sql
简介 采用spring + hibernate + freemaker+ maven搭建起来的一个hibernate增删查改和 类似mybatis动态sql查询的一个案例 增删查改demo + 动态s ...
- Spring Hibernate JPA 联表查询 复杂查询
(转自:http://www.cnblogs.com/jiangxiaoyaoblog/p/5635152.html) 今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的 ...
- 在Hibernate中处理批量更新和批量删除
批量更新是指在一个事务中更新大批量数据,批量删除是指在一个事务中删除大批量数据.以下程序直接通过Hibernate API批量更新CUSTOMERS表中年龄大于零的所有记录的AGE字段: 如果CUST ...
- hibernate.cfg.xml详细配置
<!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <? ...
- Oracle总结第二篇【视图、索引、事务、用户权限、批量操作】
前言 在Oracle总结的第一篇中,我们已经总结了一些常用的SQL相关的知识点了-那么本篇主要总结关于Oralce视图.序列.事务的一些内容- 在数据库中,我们可以把各种的SQL语句分为四大类- (1 ...
最新文章
- Corn Fields(POJ 3254状压dp)
- Qt Designer下的一些基础操作
- mysql查询每个id的前10条数据_解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据...
- MacOS中Nginx的安装「借助Homebrew」
- Jelinek-Merer与Absolute discounting 平滑方法
- 信息学奥赛一本通 1314:【例3.6】过河卒(Noip2002) | 1921:【02NOIP普及组】过河卒 | 洛谷 P1002 [NOIP2002 普及组] 过河卒
- 微模式重金招聘高级图像算法工程师
- STM32 输入捕获功能
- 计算机视觉图像去噪原理,AI笔记: 计算机视觉之图像滤波去噪: 原理、方法和效果比较...
- Shell子程序结构,函数
- 御剑情缘服务器维护吗,御剑情缘更新后登不上怎么回事 1月11日更新后进不去解决方法...
- 关于网页数据导入excel
- 《金字塔原理》要点汇总
- 在MacOS下为2K显示器开启HiDPI
- Html中所有的a标签点击打开新的窗口
- LabVIEW编程运动控制PID入门
- 国家AAAAA级旅游景区数量统计
- 关于gb2312编码的xml解析
- API电商平台获取淘宝商品详情
- SACC2018:微服务架构设计