在Hibernate中处理批量更新和批量删除
批量更新是指在一个事务中更新大批量数据,批量删除是指在一个事务中删除大批量数据。以下程序直接通过Hibernate API批量更新CUSTOMERS表中年龄大于零的所有记录的AGE字段: 如果CUSTOMERS表中有1万条年龄大于零的记录,那么Session的find()方法会一下子加载1万个Customer对象到内存。当执行tx.commit()方法时,会清理缓存,Hibernate执行1万条更新CUSTOMERS表的update语句:
view plaincopy to clipboardprint?
update CUSTOMERS set AGE=? …. where ID=i; update CUSTOMERS set AGE=? …. where ID=j; …… update CUSTOMERS set AGE=? …. where ID=k; update CUSTOMERS set AGE=? …. where ID=i;update CUSTOMERS set AGE=? …. where ID=j;……update CUSTOMERS set AGE=? …. where ID=k;
以上批量更新方式有两个缺点: (1)占用大量内存,必须把1万个Customer对象先加载到内存,然后一一更新它们。
(2)执行的update语句的数目太多,每个update语句只能更新一个Customer对象,必须通过1万条update语句才能更新一万个Customer对象,频繁的访问数据库,会大大降低应用的性能。为了迅速释放1万个Customer对象占用的内存,可以在更新每个Customer对象后,就调用Session的evict()方法立即释放它的内存:
view plaincopy to clipboardprint?
tx = session.beginTransaction(); Iterator customers=session.find("from Customer c where c.age>0").iterator(); while(customers.hasNext()){ Customer customer=(Customer)customers.next(); customer.setAge(customer.getAge()+1); session.flush(); session.evict(customer); } tx.commit(); session.close(); tx = session.beginTransaction();Iterator customers=session.find("from Customer c where c.age>0").iterator();while(customers.hasNext()){Customer customer=(Customer)customers.next();customer.setAge(customer.getAge()+1);session.flush();session.evict(customer);} tx.commit();session.close();
在以上程序中,修改了一个Customer对象的age属性后,就立即调用Session的flush()方法和evict()方法,flush()方法使Hibernate立刻根据这个Customer对象的状态变化同步更新数据库,从而立即执行相关的update语句;evict()方法用于把这个Customer对象从缓存中清除出去,从而及时释放它占用的内存。 但evict()方法只能稍微提高批量操作的性能,因为不管有没有使用evict()方法,Hibernate都必须执行1万条update语句,才能更新1万个Customer对象,这是影响批量操作性能的重要因素。假如Hibernate能直接执行如下SQL语句: update CUSTOMERS set AGE=AGE+1 where AGE>0; 那么,以上一条update语句就能更新CUSTOMERS表中的1万条记录。但是Hibernate并没有直接提供执行这种update语句的接口。应用程序必须绕过Hibernate API,直接通过JDBC API来执行该SQL语句:
view plaincopy to clipboardprint?
tx = session.beginTransaction(); Connection con=session.connection(); PreparedStatement stmt=con.prepareStatement("update CUSTOMERS set AGE=AGE+1 " +"where AGE>0 "); stmt.executeUpdate(); tx.commit(); tx = session.beginTransaction();Connection con=session.connection();PreparedStatement stmt=con.prepareStatement("update CUSTOMERS set AGE=AGE+1 "+"where AGE>0 ");stmt.executeUpdate();tx.commit();
以上程序演示了绕过Hibernate API,直接通过JDBC API访问数据库的过程。应用程序通过Session的connection()方法获得该Session使用的数据库连接,然后通过它创建PreparedStatement对象并执行SQL语句。值得注意的是,应用程序仍然通过Hibernate的Transaction接口来声明事务边界。
转载于:https://www.cnblogs.com/soundcode/archive/2010/12/20/1911941.html
在Hibernate中处理批量更新和批量删除相关推荐
- ef oracle 批量更新慢_详解Oracle中多表关联批量插入、批量更新与批量删除
概述 今天主要介绍一下Oracle数据库中多表关联批量插入.多表关联批量更新和多表关联批量删除.下面用实验来理解下~ 一.创建必须的表和序列语句 --创建部门表 dept:CREATE TABLE d ...
- mysql 批量update sql_批量更新sql |批量update sql
zencart批量更新后台邮箱地址sql zencart批量更新后台邮箱地址sql UPDATE `configuration` SET `configuration_value` = '新邮箱地址' ...
- MySQL的批量更新和批量新增优化
MySQL的批量更新和批量插入优化 如果需要批量插入和批量更新操作就需要进行sql 的优化,否则近30万条数据的插入或更新就会耗费几分钟甚至更多的时间, 此文仅批量插入和批量更新的几种优化. 批量插入 ...
- batchupdate写法_批量更新sql_批量update_sql(Batch update sql_ batch update_sql).doc
批量更新sql_批量update_sql(Batch update sql_ batch update_sql) 批量更新sql_批量update_sql(Batch update sql_ batc ...
- yii 全选 php,Yii2.0实现的批量更新及批量插入功能示例
本文实例讲述了Yii2.0实现的批量更新及批量插入功能.分享给大家供大家参考,具体如下: 批量更新 方法1 /** * 批量更新循环周期 * @param array $condition * $co ...
- mybatis mysql 批量更新_mysql批量update更新,mybatis中批量更新操作
在日常开发中,有时候会遇到批量更新操作,这时候最普通的写法就是循环遍历,然后一条一条地进行update操作.但是不管是在服务端进行遍历,还是在sql代码中进行遍历,都很耗费资源,而且性能比较差,容易造 ...
- Hibernate中的JPA 2.1条件删除/更新和临时表
从JPA 2.0版开始, EntityManager提供了方法getCriteriaBuilder()来动态构建选择查询,而无需使用Java持久性查询语言(JPQL)进行字符串连接. 在2.1版中,此 ...
- MySql数据库Update批量更新与批量更新多条记录的不同值实现方法
批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other ...
- mysql批量更新,批量插入之replace语句/insert into... on duplicate key update语句
mysql批量更新/插入数据有以下方法,使用这些方法批量插入数据/更新数据的时候就不用在代码层次增加判断数据是否已存在的逻辑了. 1:replace语句 2: insert into... on du ...
最新文章
- 所谓的Dumb Question
- java 1.8stream_java jdk1.8 使用stream流进行list 分组归类操作
- PyQt5入门——删除、清空layout布局中的所有对象(含常见问题详解)
- 计算机如何学会自动构图?
- yuv 420 mp4 flv 视频与acc 各类音视频测试下载地址
- 2020软考数据库系统工程师-下午案例分析真题解析视频-任铄-专题视频课程
- Java 垃圾回收机制(面试高频问题之一)
- 【笔试题】刺客信条/Assassin’s Creed (阿里巴巴2020.08.26笔试第二题)
- 只需五步,中国电信物联网报障指引来了
- exfat默认配置大小_我的空间哪里去了?注意exfat格式设置的陷阱
- 分类算法之K-Nearest Neighbors
- SpringBoot+Vue实现邮箱登录注册功能
- Java编程笔记9:容器(下)
- html各种弹出框和提示框
- 监狱逃离 51nod1299 最小割
- 敏捷Scrum指南一:Scrum起源
- Android逆向工程:解决针对小米系统应用,使用Apktool反编译失败问题!
- 装机U盘制作教程(图文并茂)
- VEG发射世界空间的粒子
- Vue 使用 rem布局
热门文章
- linux dma拷贝数据到用户态,图解:零拷贝Zero-Copy技术大揭秘
- 【神经网络】(7) 迁移学习(CNN-MobileNetV2),案例:乳腺癌二分类
- 【神经网络】(1) 简单网络,实例:气温预测,附python完整代码和数据集
- 一、multiprocessing.pool.RemoteTraceback
- 基于python的数据分析方法五种_利用Python进行数据分析 第5章 pandas入门(1)
- 基于VS+Qt Gui显示控制台用于调试
- CV_8UCV_32FCV_32S
- 【从零开始的ROS四轴机械臂控制】(五)- 构建运动控制服务
- 设置WebStorm查看本地源码文件个人修改的历史记录快捷键Alt+Shift+H、Ctrl+Shift+H(通常用于调试bug,发现文件出问题需要回溯到若干天之前)
- 根据keyName(如:result.data.name),无限深度遍历获取keyValue