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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.balignl 16,0xdeadbeef浅析

http://zqwt.012.blog.163.com/blog/static/12044684201031102956976/ 最近在分析u-boot的源代码&#xff0c;看到这一行&#xff1a; .balignl 16, 0xdeadbeef不知道为什么要这样写&#xff0c;0xdeadbeef&#xff0c;明显是个单词组&#xff0c;写在这里有何意义呢&am…

使用maven导入任意jar包

http://mvnrepository.com/ 我这里&#xff0c;因为是spark1.5.2版本。 保存&#xff0c;maven会自动下载jar包到本地仓库。 转载于:https://www.cnblogs.com/lchzls/p/6281764.html

Linux下静态IP地址的设置及TFTP服务的搭建

TFTP&#xff08;Trivial File Transfer Protocol,简单文件传输协议&#xff09;是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。TFTP承载在UDP上&#xff0c;提供不可靠的数据流传输服务&#xff0c;…

ASCII码表

From: http://www.96yx.com/tool/ASC2.htm ASCII码表 信息在计算机上是用二进制表示的&#xff0c;这种表示法让人理解就很困难。因此计算机上都配有输入和输出设备&#xff0c;这些设备的主要目的就是&#xff0c;以一种人类可阅读的形式将信息在这些设备上显示出来供人阅读理…

inotify

Linux 2.6内核中的文件系统变化通知机制 一、 引言 众所周知&#xff0c;Linux 桌面系统与 MAC 或 Windows 相比有许多不如人意的地方&#xff0c;为了改善这种状况&#xff0c;开源社区提出用户态需要内核提供一些机制&#xff0c;以便用户态能够及时地得知内核或底层硬件设备…

bzoj 3924 幻想乡战略游戏

题目大意&#xff1a; 有边权点权的树&#xff0c;动态修改点权 每次修改后求带权重心x (\(minimize\) \(S\sum_i val[i]*dist[x][i]\)) 分析&#xff1a; 从暴力找突破口&#xff1a; 对于边x,y&#xff0c;设长度为len&#xff0c;切断后x半边树权值和为\(w_1\)&#xff0c;y…

Linux 系统应用编程——网络编程(服务器模型)

在网络通信过程中&#xff0c;服务端通常需要处理多个客户端。由于多个客户端的请求可能会同时到来&#xff0c;服务器端可采用不同的方法来处理。总体上来说&#xff0c;服务器端可采用两种模型来实现&#xff1a;循环服务器模型和并发服务器模型。 循环服务器模型是指服务器端…

makefile中的patsubst, wildcard, notdir

From:http://blog.sina.com.cn/s/blog_60cbc1700100nuhz.html 1、wildcard : 扩展通配符 2、notdir &#xff1a; 去除路径 3、patsubst &#xff1a;替换通配符 例子&#xff1a; 建立一个测试目录&#xff0c;在测试目录下建立一个名为sub的子目录 $ mkdir test $ cd test $…

搭建实用深度学习环境(Ubuntu16.10+Theano0.8.2+Tensorflow0.11.0rc1+Keras1.1.0)

在动手安装之前&#xff0c;首先要确定硬件&#xff0c;系统&#xff0c;准备安装软件的版本&#xff0c;确定这些软硬件之间是否相互支持或兼容。本文安装的主要环境和软件如下&#xff1a; Ubuntu16.10CUDA8.0(cudnn5.1,CNMEM)Theano0.8.2Tensorflow0.11.0rc1Keras1.1.0 显卡…

Statspack安装心得

一&#xff0c;在win7下应该以管理员身份运行&#xff0c;sqlplusw 二&#xff0c;安装前要要执行如下代码&#xff0c;创建表空间 SQL> create tablespace perfstat 2datafile d:\oracle\oradata\eygle\perfstat.dbf 3size 500M 4extent management local; eygle为你的数据…

Linux 系统应用编程——网络编程(基础篇)

一、网络体系结构 1、OSI模型和TCP/IP 模型 网络体系结构指的是网络的分层结构以及每层使用的协议的集合。其中最著名的就是OSI协议参考模型&#xff0c;他是基于国际标准化组织&#xff08;OSI&#xff09;的建议发展起来的。它分为7个层次&#xff1a;应用层、表示层、会话层…

函数的定义与调用

1.理解函数 函数是一段代码块&#xff0c;它只定义一次&#xff0c;但可以被执行或调用任意次。函数可以有参数&#xff0c;实参&#xff08;argument&#xff09;和形参&#xff08;parameter&#xff09;&#xff0c;实参是在运行时的函数调用时传入的参数&#xff0c;形参是…

C++中函数的默认参数

使用方法&#xff1a; &#xff08;1&#xff09;在函数声明或定义时&#xff0c;直接对参数赋值&#xff0c;该参数就是默认参数。&#xff08;2&#xff09;在函数调用时&#xff0c;省略部分或全部参数&#xff0c;这时就会使用默认参数进行代替。注意事项&#xff1a; &…

Linux 系统应用编程——网络编程(socket编程)

二、网络编程基础 1、套接字概述 套接字就是网络编程的ID。网络通信&#xff0c;归根到底还是进程间的通信&#xff08;不同计算机上的进程间的通信&#xff09;。在网络中&#xff0c;每一个节点&#xff08;计算机或路由器&#xff09;都有一个网络地址&#xff0c;也就是IP地…

Linux 代码格式化工具 indent

以下是我最喜欢的代码格式化脚本&#xff1a; #!/bin/shif [ $# -lt 1 ]; thenecho "Usage: $0 <file>"exit 1fi# format a source file(*.c, *.h)formatSrcfile(){indent -npro -nip -lp -npsl -npcs -i4 -ts4 -sob -l140 -ss -nsaf -nsai -nsaw -bl -bli 0 $…

Android处理ListView中的Item中的Button按钮不能点击的问题

问题描述&#xff1a;ListView列表中的Button按钮按钮不能点击 解决办法&#xff1a;在ListView中的Item项的布局文件中加上&#xff1a;android:descendantFocusability"blocksDescendants"&#xff0c;问题解决。

php curl拉取远程图片

<?php $url "图片绝对地址/thumbnail.jpg"; $filename curl.jpg; getImg($url, $filename); /**通过curl方式获取制定的图片到本地* 完整的图片地址* 要存储的文件名*/ function getImg($url "", $filename "") {if(is_dir(basename($fi…

Linux 下 NFS服务的搭建

NFS是Network File System的简写&#xff0c;即网络文件系统。 网络文件系统是许多操作系统都支持的文件系统中的一种&#xff0c;也被成为NFS。NFS允许一个系统在网络上与他人共享目录和文件。通过使用NFS&#xff0c;用户可以像访问本地文件一样访问远端系统上的文件。 NFS所…

GCC 参数详解

From: http://www.cppblog.com/SEMAN/archive/2005/11/30/1440.html 先附上三篇相关文章&#xff1a; LINUX下的C编译器GCC简介 linux上的C/C编译器gcc/egcs详解 gcc和g的区别(很详细的描述) [介绍] gcc and g分别是gnu的c & c编译器 gcc/g在执行编译工作的时候&#…

电子客票状态整理

1.OPEN FOR USE&#xff1a;客票有效 2.VOID&#xff1a;已作废 3.REFUND&#xff1a;已退票 4.CHECK IN&#xff1a;正在办理登机 5.USED/FLOWN&#xff1a;客票已使用 6.SUSPENDED&#xff1a;系统处理&#xff0c;或人为挂起禁止使用该票 7.PRINT/EXCH&#xff1a;电子客票已…