Hibernate一级缓存测试分析
Hibernate 一级缓存测试分析
Hibernate的一级缓存就是指Session缓存,此Session非http的session会话技术,可以理解为JDBC的Connection,连接会话,Session缓存就是一块内存空间,用来存放相互管理的java对象,在使用Hibernate查询对象的时候,首先使用对象的OID(Object ID)在Hibernate 的一级缓存空间进行查找,如果通过OID匹配到了对象,就直接从一级缓存中取出使用,如果没有找到匹配该OID值的对象,这才会进行查询数据库。当从数据库中查询数据的时候,该数据就会被放入到Session缓存中,目的就是为了减少数据库的访问次数,从而提高性能。
Hibernate缓存特点
- 当应用程序调用Session接口的 save(), update(), saveOrUpdate() 时候,如果缓存中没 有相应的对象,Hb就会自动的把查询信息加入到缓存。
- 当应用程序调用Session接口的 load(), get(), list() 等查询方法的时候,会进行判断缓存中是否有数据,同摘要。
- 当应用程序调用Session接口的 close() Session缓存会被清空
接下来进行测试一级缓存
首先测试一级缓存是否存在?对user表的主键为“1”的分别进行两次查询:
public void demo1 (){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
User user1 = session.get(User.class, "1");
System.out.println(user1);
System.out.println("-------------");
User user2 = session.get(User.class, "1");
System.out.println(user2);
System.out.println(user1 == user2);
transaction.commit();
session.close();
}
运行结果:

我们发现第一次执行Session的get()方法的时候,由于一级缓存中没有数据,所以会向数据库发送一条sql语句进行查询,第二次调用get()的时候,则不会发送sql语句,而是从一级缓存中取的,所以user和user2的内存地址相等
一级缓存的快照区
Hibernate向一级缓存放入数据的时候,同时复制一份放到Hibernate快照中,当使用commot()提交事务的时候,同时会清理Session的一级缓存,这是会用OID判断一级缓存中的对象和快照中的对象是否一致,如果一致则执行 update 语句,将缓存中的内容同步到数据库,并且更新快照,这也就实现了不使用 update 语句就可以自动更新数据库,Hibernate快照的作用也就是为了保持缓存中的数据和数据库中的数据的一致性。
快照区代码测试
我们在get的时候设置断点,看到右侧变量 session->persitenceContext->entitlxxx->head,也就是缓存中是为空的
现在继续执行
我们发现在缓存区域已经有了数据了,同时Hibernate 也会在快照区域创建数据,在 Hibernate3 里面它使用的是Map进行存储的,map的key作为一级缓存去,value作为一级快照区,当进行查询的时候,会同时给缓存和快照去放入相同的数据,当orm对象属性发生变化的时候,会首先改变缓存区的值,当进行事务提交的时候,会比较缓存和快照的内容,如果一致则不操作,不一致则更新数据库。
继续执行:
commin()的时候,自动进行更新,clear().evict()的时候会清除缓存(删除表中数据的时候也会)
public void demo1 (){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
User user1 = session.get(User.class, "1");
System.out.println(user1);
System.out.println("-------------");
session.clear();
User user2 = session.get(User.class, "1");
System.out.println(user2);
System.out.println(user1 == user2);
transaction.commit();
session.close();
}
输入如下:
Hibernate:
select
user0_.uid as uid1_1_0_,
user0_.name as name2_1_0_,
user0_.username as username3_1_0_,
user0_.password as password4_1_0_,
user0_.email as email5_1_0_,
user0_.telephone as telephon6_1_0_,
user0_.sex as sex7_1_0_
from
user user0_
where
user0_.uid=?
User{uid=1, username=baiChaoHua, password=null, name=null, email=null, telephone=null, birthady=null, sex=null, state=0, code=null}
-------------
Hibernate:
select
user0_.uid as uid1_1_0_,
user0_.name as name2_1_0_,
user0_.username as username3_1_0_,
user0_.password as password4_1_0_,
user0_.email as email5_1_0_,
user0_.telephone as telephon6_1_0_,
user0_.sex as sex7_1_0_
from
user user0_
where
user0_.uid=?
User{uid=1, username=baiChaoHua, password=null, name=null, email=null, telephone=null, birthady=null, sex=null, state=0, code=null}
false
可以看出执行执行了两次sql,user对象的内存地址也就自然不一样
一级缓存常用的API:
clear():清空一级缓存。evict():清空一级缓存中指定的某个对象。refresh():重新查询数据库,用数据库中的信息来更新一级缓存与快照区。
未完待续...
Hibernate一级缓存测试分析的更多相关文章
- Hibernate一级缓存(基于查询分析)
首先我们应该弄清什么是hibernate缓存:hibernate缓存是指为了降低应用程序对物理数据源的访问频次,从而提高应用程序的运行性能的一种策略.我们要将这个跟计算机内存或者cpu的缓存区分开. ...
- hibernate一级缓存
理解 Hibernate 一级缓存 Hibernate 一级缓存默认是打开,不需要任何的配置.实际上,你无法强制禁止它的使用. 如果你理解了一级缓存实际上和会话是关联的,就很容易理解一级缓存.总所周知 ...
- hibernate一级缓存及对象的状态
hibernate中实体类对象的状态 在hibernate中实体类对象有三种状态 (1)瞬时态(临时态) 瞬时态:即我们自己创建一个对象,还没有保存到数据库就叫临时态,其实也可以说是对像没有id值,跟 ...
- Hibernate一级缓存(补)
------------------siwuxie095 什么是缓存 缓存是介于应用程序和永久性数据存储源(如:硬盘上的 ...
- 转载 hibernate一级缓存和二级缓存的区别
文章来源:http://blog.csdn.net/defonds/article/details/2308972 hibernate一级缓存和二级缓存的区别 缓存是介于应用程序和物理数据源之 ...
- Hibernate一级缓存和三种状态
Hibernate一级缓存又称session缓存,生命周期很短,跟session生命周期相同. 三种状态:1.transient(瞬时态):刚new出来的对象,既不在数据库中,也不在session管理 ...
- hibernate一级缓存的源码初窥
hibernate的一级缓存的存在使得hibernate可以在操作实体化对象的时候减少对于数据库的访问.hibernate的一级缓存实际上就是指的session缓存,它的生命周期和session相同. ...
- Hibernate 一级缓存的陷阱
最近公司的应用经常报OOM,一开始我以为是公司业务数据太多,导致内存不够,所以只是简单的把容器的内存加大.撑了几天后这个错仍然被报出来.后来我仔 细分析过项目代码后,没有发现有任何引起内存泄漏的地方. ...
- Hibernate <一级缓存>
Hibernate缓存分为三级: 一级缓存:基于事务级别(内存)的缓存,也可以成为session级别缓存 二级缓存:依赖于第三方,当请求一个对象时,先在缓存里面查找,如果没有就执行查询语句 查询缓存: ...
随机推荐
- 41-json.decoder.JSONDecodeError: Invalid control character at: line 6894 column 12 (char 186418)
在使用python中将单词本的单词用正则匹配成字典后,以json存储,仪json读入,但是一直报错: 原因是: 正则处理后的数据有的出了点问题,导致一个字典的 有多个相同的键!!!,则肯定会报错啊!! ...
- Halcon的二维码解码步骤和解码技巧
一.二维码简介 1 . 类型多样,常见的有QR Code二维码. Data Matrix二维码等. 2.高密度编码,信息容量大. 3.容错能力强,具有纠错功能:二维码因穿孔.污损等引起局部损坏时,照样 ...
- linux下一些常用系统命令
查看系统打开的文件数 lsof|wc -l 查看当前目录下的文件数 find -type f | wc -l 查看某个目录下的文件数,注意这里/home包括其所有子目录 find /home -typ ...
- Extended Backus–Naur Form
From Wikipedia, the free encyclopedia In computer science, Extended Backus–Naur Form (EBNF) is a fam ...
- 2018年UI设计趋势概览
互联网产品的用户界面设计趋势是根据用户的不同需求而不断变化的.在仔细分析了过去几年用户界面设计的趋势和创新之后,我们可以发现其背后的一些规律,2018年UI界面设计的趋势如下. 渐变色 在过去的几年 ...
- 20155232 2016-2017-3 《Java程序设计》第9周学习总结
20155232 2016-2017-3 <Java程序设计>第9周学习总结 教材学习内容总结 第16章 JDBC(Java DataBase Connectivity)即java数据库连 ...
- nginx怎么与tomcat完美结合
nginx怎么与tomcat完美结合 现在公司一个服务器上需要部署两个项目,其中一个项目已经正式上线,并且已经占用了80端口,另外一个项目 部署上去后,访问必须要加端口号,这样的用户体验非常不好,那么 ...
- 2018.09.27 bzoj4300: 绝世好题(二进制dp)
传送门 简单dp. 根据题目的描述. 如果数列bn{b_n}bn合法. 那么有:bi−1b_{i-1}bi−1&bi!=0b_i!=0bi!=0,因此我们用f[i]f[i]f[i]表示数 ...
- 2018.07.04 BZOJ 2618 Cqoi2006凸多边形(半平面交)
2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec Memory Limit: 128 MB Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n ...
- 2018.07.24 bzoj3531: [Sdoi2014]旅行(树链剖分+动态开点)
传送门 树链剖分. 如何维护? 如果颜色少直接每种颜色一颗线段树走人. 但这题颜色数量不大于1e5" role="presentation" style="po ...


