hibernate Session一级缓存 应该注意的地方
Session缓存
Hibernate的一级缓存是由Session提供的,因此它存在于Session的整个生命周期中,当程序调用save()/update()/saveOrupdate()/get()等及查询接口方法list()/iterator()方法时候,如果session中不存在该对象,那么会先将本次的对象存储到一级缓存中便于以后使用,当Session关闭时同时清空一级缓存数据。clear()/evict();Session的缓存可以减少访问数据库的次数,进而提高效率。保证缓存中的对象与数据库的记录保持同步,当缓存的对象改变后,session不会立即执行sql,而是将多个sql语句合并为一条sql进行执行,提高效率。当用户需要对指定的对象进行修改的时候,如果对于同一个属性修改了多次,其实hibernate的session缓存并不是执行多个update语句,而是以最后一个更新为准而发送一条更新的sql。
session.get()与session.load()方法
get()和load()方法先将获取的对象存储到一级缓存,当再次加载同一个持久化对象的时候先检测一级缓存中是否有该对象,如果有直接获取,不会发送SQL语句,否则才发送SQL
public void cache(){
Session session = SessionUtils.getCurrentSession();
session.beginTransaction();
Query query = null;
DataType dataType = null;
DataType dataType1 = null;
try {
// 获取要修改的对象
dataType = (DataType) session.get(DataType.class, new Long(1));
// session.evict(dataType);和session.clear();方法会清理缓存
dataType1 = (DataType) session.get(DataType.class, new Long(1));
System.out.println(dataType == dataType1);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
get()如果没有找到持久化类返回null,有可能导致空指针异常。load()如果没有找到持久化类直接抛出异常。get()是直接加载数据,load()是延迟加载,当使用被加载数据的时候才发送SQL。Hibernate对于load()认为数据库一定存在,因此可以放心的使用代理进行延迟加载,如果使用中发现了问题,那么只能抛出异常。而对于get方法一定要获取真实的数据,否则返回null。
Query对象实例中的list()和iterator方法
List()查询出来的结果会被缓存起来,那么当iterator()再查看的时候会先发送查询id的SQL,但是查询实体的SQL不会发出,因为它首先回去一级缓存中获取已经缓存的数据。
Iterator()方法加载的所有的持久化类对象要进行批处理修改的时候,每一个对象都要先缓存再修改,因此在循环中需要释放一级缓存中的内存占用,避免内存溢出。
public void cache(){
Session session = SessionUtils.getCurrentSession();
session.beginTransaction();
Query query = null;
try {
query = session.createQuery("from DataType");
List list = query.list();
System.out.println(list);
// session.clear();
Iterator<DataType> it = query.iterate();
while(it.hasNext()){
System.out.println(it.next());
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
public void cache(){
Session session = SessionUtils.getCurrentSession();
session.beginTransaction();
Query query = null;
try {
query = session.createQuery("from DataType");
Iterator<DataType> it = query.iterate();
while(it.hasNext()){
DataType dataType = it.next();
dataType.setVip('K');
session.flush();
session.clear();
}
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}
}
list()直接一次性获取到所有持久化类的对象 iterator()先获取的是所有的数据的id值。当真正的遍历使用数据的 时候再发送select语句。因此该方法一定要处于session会话中。 list发送的查询语句只有1条。Iterator发送多条查询语句,因此iterator的效率低下。
list()如果表中有少量条数据,iterator()如果表中有N W条数据
hibernate Session一级缓存 应该注意的地方的更多相关文章
- hibernate(二)一级缓存和三种状态解析
序言 前一篇文章知道了什么是hibernate,并且创建了第一个hibernate工程,今天就来先谈谈hibernate的一级缓存和它的三种状态,先要对着两个有一个深刻的了解,才能对后面我要讲解的一对 ...
- Hibernate 的一级缓存和二级缓存总结
缓存:缓存是什么,解决什么问题? 位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为缓存Cache.缓存目的:让数据更接近于应用程序,协调速度不匹配,使访问速度更快 ...
- Hibernate的一级缓存
Hibernate的一级缓存 什么是缓存:缓存将数据库/硬盘上文件中数据,放入到缓存中(就是内存中一块空间).当再次使用的使用,可以直接从内存中获取 缓存的好处:提升程序运行的效率.缓存技术是Hibe ...
- Hibernate中一级缓存和二级缓存使用详解
一.一级缓存二级缓存的概念解释 (1)一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个 session(一定要同一个ses ...
- hibernate学习(四)hibernate的一级缓存&快照
缓存:提高效率 硬件的 CPU缓存 硬盘缓存 内存 软件的 io流缓存 hibernate 的一级缓存 也是为了操作数据库的效率. 证明一级缓存在 : Person p=sessio ...
- Hibernate之一级缓存和二级缓存
1:Hibernate的一级缓存: 1.1:使用一级缓存的目的是为了减少对数据库的访问次数,从而提升hibernate的执行效率:(当执行一次查询操作的时候,执行第二次查询操作,先检查缓存中是否有数据 ...
- Hibernate中一级缓存和二级缓存
缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事 ...
- Hibernate 之 一级缓存
本篇文章主要是总结Hibernate中关于缓存的相关内容. 先来看看什么是缓存,我们这里所说的缓存主要是指应用程序与物流数据源之间(例如硬盘),用于存放临时数据的内存区域,这样做的目的是为了减少应用程 ...
- (转)Hibernate的一级缓存
http://blog.csdn.net/yerenyuan_pku/article/details/70148567 Hibernate的一级缓存 Hibernate的一级缓存就是指Session缓 ...
随机推荐
- 64个命令,每天一个linux命令目录, shutdown,tee,rcp,
每天一个linux命令目录 开始详细系统的学习linux常用命令,坚持每天一个命令,所以这个系列为每天一个linux命令.学习的主要参考资料为: 1.<鸟哥的linux私房菜> 2.htt ...
- linux如何安装xampp,以及融合dvwa
1.官网下载:https://www.apachefriends.org/download.html 2.赋予执行权限 [admin@19-56 ~]$ chmod +x xampp-linux-x6 ...
- 函数指针&指针函数
https://blog.csdn.net/luoyayun361/article/details/80428882
- C# SendMail 发送邮件
最近因为用的发送邮件的地方,就查询了资料,总结以下几个方法 1.利用新浪邮箱发送 2.利用公司邮箱发送 3.利用CDO发送,这种方式要引用Interop.ADODB.dll(http://www.no ...
- SAP MM模块 经常使用函数
1. MM_CURRENT_PRICE_DOCUMENT 2. ME_READ_HISTORY 获取採购行项目的历史记录 CALL FUNCTION 'ME_READ_HISTORY' ...
- 攻克了Cocoapods Undefined symbols for architecture _OBJC_CLASS_xxxx的问题,辛苦死我了,记录下之后有空在研究
网上找了一大包将尽3个小时没有解决,原本以为是我升级到10.10的原因,把cocoapod 重装 stackoverflow google 用尽了也不知道为啥 结果是这个样子的 编译出现这个.... ...
- STM32f103按键检测程序实现长按短按
背景 只要使用单片机,按键检测基本上是一定要实现的功能.按键检测要好用,最重要的是实时和去抖.初学者往往会在主循环调用按键检测程序(实时)并利用延时去抖(准确).这种在主循环内延时的做法对整个程序非常 ...
- jquery遍历数组的方式
1,for循环: var arr = new Array(13.5,3,4,5,6); for(var i=0;i<arr.length;i++){ arr[i] = arr[i]/2.0; } ...
- 获取request中的查询参数
//获取request中的查询参数 public static Map<String, Object> getRequestParamsByMap(HttpServletRequest r ...
- oracle获取时间毫秒数
select (sysdate-to_date('1970-01-01','yyyy-mm-dd')-8/24)*24*60*60*1000-1* 60 * 60 * 1000 millisecon ...