hibernate的查询缓存和二级缓存的配合使用
我的上一篇博客Hibernate缓存体系之查询缓存(query cache),以及list和iterate方法的差别介绍了查询缓存的概念,以及list和iterate的差别。读者可能注意到:那篇博客測试的前提是,仅仅开启查询缓存,没有开启二级缓存。
通过各种情形測试,我们能够得出一个结论:仅仅开启查询缓存。不开启二级缓存是没有意义的。
为什么这么说呢?上一篇博客能够看出。不开启二级缓存,iterate()方法存在N+1次数据库查询问题,list方法最多仅仅能命中id。也须要N次数据库查询,不管是哪儿种情况,查询缓存已经失去了意义。这篇博客我们开启二级缓存的情况下。将上篇博客的情况再測试下。看下会是什么效果。
hibernate4.1.6在hibernate.cfg.xml进行例如以下配置,能够开启二级缓存。
<property name="cache.use_second_level_cache">true</property>
<property name="cache.region.factory_class">org.hibernate.cache.EhCacheRegionFactory</property>
因为測试代码和数据库都和上篇博客一模一样。唯一不同就是开启了二级缓存。这里不再附代码。直接通过測试结果来分析结论。
1. 2次list()运行结果分析
testUseList()运行结果例如以下:
Hibernate:
select
student0_.id as id0_,
student0_.name as name0_,
student0_.age as age0_
from
Student student0_
where
student0_.name='zhangsan111'
list语句測试query cache:hibernate.Student@d6c07[id=1, name=zhangsan111, age=18]
list语句測试query cache:hibernate.Student@6279d[id=2, name=zhangsan111, age=18]
list语句測试query cache:hibernate.Student@12dd76[id=3, name=zhangsan111, age=18]
-------list进行第二次查询------
list语句測试query cache:hibernate.Student@1e6696c[id=1, name=zhangsan111, age=18]
list语句測试query cache:hibernate.Student@135133[id=2, name=zhangsan111, age=18]
list语句測试query cache:hibernate.Student@381d92[id=3, name=zhangsan111, age=18]
能够发现list()第一次发出1条sql语句。第二次查询没有訪问数据库,直接从缓存中获取的数据。在开启查询缓存和二级缓存的情况下,list将获取到的id放入查询缓存,key是sql语句。将实体对象放入二级缓存,key是实体对象的主键值。list会首先依据sql语句去查询缓存中获取id,假设没有获取到则发出1条sql查询语句,查询出全部须要的字段值。
2. 2次iterate()运行结果分析
testUseIterator()运行结果例如以下:
<span style="font-size:14px;">Hibernate:
select
student0_.id as col_0_0_
from
Student student0_
where
student0_.name='zhangsan111'
Hibernate:
select
student0_.id as id0_0_,
student0_.name as name0_0_,
student0_.age as age0_0_
from
Student student0_
where
student0_.id=?
iterate语句測试query cache:hibernate.Student@1f7cdc7[id=1, name=zhangsan111, age=18]
Hibernate:
select
student0_.id as id0_0_,
student0_.name as name0_0_,
student0_.age as age0_0_
from
Student student0_
where
student0_.id=?
iterate语句測试query cache:hibernate.Student@135133[id=2, name=zhangsan111, age=18]
Hibernate:
select
student0_.id as id0_0_,
student0_.name as name0_0_,
student0_.age as age0_0_
from
Student student0_
where
student0_.id=?
iterate语句測试query cache:hibernate.Student@1042fcc[id=3, name=zhangsan111, age=18]
-------iterate进行第二次查询------
Hibernate:
select
student0_.id as col_0_0_
from
Student student0_
where
student0_.name='zhangsan111'
iterate语句測试query cache:hibernate.Student@ad339b[id=1, name=zhangsan111, age=18]
iterate语句測试query cache:hibernate.Student@14c4d61[id=2, name=zhangsan111, age=18]
iterate语句測试query cache:hibernate.Student@6c5356[id=3, name=zhangsan111, age=18]</span>
第一次iterate()查询,因为查询缓存和二级缓存中都没有数据,须要进行N+1次数据库查询;第二次查询,仅仅发出一条sql查询主键值,兴许依据主键值从二级缓存中获取具体信息。iterate方法会将获取到的实体对象存入二级缓存。至于是否会将id存入查询缓存,这里还不能确定,只是能够肯定的是。iterate不会利用查询缓存中的id值。而是每次查询都又一次使用sql查询满足条件的记录主键值。
之后再依据主键从二级缓存中查询实体对象。
3. 先iterate后list运行结果分析
testIteratorAndList1()运行结果例如以下:
<span style="font-size:14px;">Hibernate:
select
student0_.id as col_0_0_
from
Student student0_
where
student0_.name='zhangsan111'
Hibernate:
select
student0_.id as id0_0_,
student0_.name as name0_0_,
student0_.age as age0_0_
from
Student student0_
where
student0_.id=?
iterate语句測试query cache:hibernate.Student@58cca9[id=1, name=zhangsan111, age=18]
Hibernate:
select
student0_.id as id0_0_,
student0_.name as name0_0_,
student0_.age as age0_0_
from
Student student0_
where
student0_.id=?
iterate语句測试query cache:hibernate.Student@1042fcc[id=2, name=zhangsan111, age=18]
Hibernate:
select
student0_.id as id0_0_,
student0_.name as name0_0_,
student0_.age as age0_0_
from
Student student0_
where
student0_.id=?
iterate语句測试query cache:hibernate.Student@38d460[id=3, name=zhangsan111, age=18]
-------第一次使用iterate,第二次使用list查询------
Hibernate:
select
student0_.id as id0_,
student0_.name as name0_,
student0_.age as age0_
from
Student student0_
where
student0_.name='zhangsan111'
list语句測试query cache:hibernate.Student@7efa96[id=1, name=zhangsan111, age=18]
list语句測试query cache:hibernate.Student@75c78d[id=2, name=zhangsan111, age=18]
list语句測试query cache:hibernate.Student@3acc67[id=3, name=zhangsan111, age=18]</span>
这里能够看出,iterate的缓存信息对于list是没有帮助的。list会发出1条sql。从数据库中查询全部须要的字段值。这里能够看出:iterate方法不会将主键值放到查询缓存中,由于假设放入查询缓存的话。这里的list是没有必要再发出sql查询的。
4. 先list后iterate运行结果分析
testIteratorAndList2()运行结果例如以下:
<span style="font-size:14px;">Hibernate:
select
student0_.id as id0_,
student0_.name as name0_,
student0_.age as age0_
from
Student student0_
where
student0_.name='zhangsan111'
list语句測试query cache:hibernate.Student@67c1a6[id=1, name=zhangsan111, age=18]
list语句測试query cache:hibernate.Student@12f41a5[id=2, name=zhangsan111, age=18]
list语句測试query cache:hibernate.Student@17ebe66[id=3, name=zhangsan111, age=18]
-------第一次使用list,第二次使用iterate查询------
Hibernate:
select
student0_.id as col_0_0_
from
Student student0_
where
student0_.name='zhangsan111'
iterate语句測试query cache:hibernate.Student@feecca[id=1, name=zhangsan111, age=18]
iterate语句測试query cache:hibernate.Student@6bd9e0[id=2, name=zhangsan111, age=18]
iterate语句測试query cache:hibernate.Student@11710be[id=3, name=zhangsan111, age=18]</span>
这里可以得出的结论,跟2次list()查询几乎相同。
唯一的区别是:iterate每次查询都会发出查询实体对象id的sql语句。
5. 总结
通过开启查询缓存和二级缓存,相同的sql查询可以直接使用查询缓存中的id和二级缓存中的实体对象,可以有效的降低反复的数据库查询,可以提高查询效率。也就是说:同一时候开启查询缓存和二级缓存是有意义的。也是实际使用hibernate的最佳配置。
进一步的。我们也能够看出list和iterate方法的差别。list()会将实体对象的id放入查询缓存,将实体对象本身放入二级缓存。iterate不会将实体对象的id放入查询缓存。可是会将实体对象本身存入二级缓存。
假设第二次查询可以命中的情况下:list全然不须要查询数据库,可以先从查询缓存中获取到id。再从二级缓存中获取实体对象。iterate一定会发出一条查id的sql,然后去二级缓存中获取实体对象。
至此hibernate的二级缓存、查询缓存的关系已经讲完。list和iterate差别也已经測试出。
希望能对大家有帮助,假设错误。欢迎大牛们指正。
hibernate的查询缓存和二级缓存的配合使用的更多相关文章
- [原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate一级缓存、二级缓存以及查询缓存的关系
转载自http://blog.csdn.net/maoyeqiu/article/details/50209893 前两天总结了一下二级缓存和查询缓存的关系,但是又有一个新的问题,就是查询缓存缓存到二 ...
- Hibernate的一级缓存、二级缓存和查询缓存。
Hibernate的Session提供了一级缓存的功能,默认总是有效的,当应用程序保存持久化实体.修改持久化实体时,Session并不会立即把这种改变提交到数据库,而是缓存在当前的Session中,除 ...
- hibernate 一级缓存,二级缓存,查询缓存
1.一级缓存是session级的缓存,session结束即事务提交,session关闭,缓存清除.效果不大 get方式:一个session内,第二次查询不连数据库.适用于一级缓存 load方式:懒加载 ...
- 【转】hibernate缓存:一级缓存和二级缓存
什么是缓存? 缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用程序的运行性能.Hibernate在进行 ...
- Hibernate中的一级缓存、二级缓存和懒加载(转)
1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...
- Hibernate一级缓存与二级缓存的区别
一级缓存: 就是Session级别的缓存.一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中. 如果短时间内这个session(一定要同一个session)又做了同一个操作,那么h ...
- Hibernate中一级缓存和二级缓存使用详解
一.一级缓存二级缓存的概念解释 (1)一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个 session(一定要同一个ses ...
- Hibernate中的一级缓存、二级缓存和懒加载
1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...
随机推荐
- 【04】图解JSON
[04]图解JSON 附件列表
- C#Windows服务安装
1,做好windows服务后,生成 一下,然后在项目目录中找到bin文件夹下的Debug文件夹,文件夹下有文件xxxx.exe 2,然后在C:\Windows\Microsoft.NET\Framew ...
- “玲珑杯”ACM比赛 Round #18
“玲珑杯”ACM比赛 Round #18 Start Time:2017-07-15 12:00:00 End Time:2017-07-15 15:46:00 A -- 计算几何你瞎暴力 Time ...
- 全库修改SQL Server现有排序规则
近日,在项目Debug过程中发现了SQL Server排序规则冲突的问题. 由于原数据库是从英文环境的SQL中生成的,其排序规则为“SQL_Latin1_General_CP1_CI_AS”,备份到本 ...
- 新一代 javascript 模板引擎
artTemplate-3.0 新一代 javascript 模板引擎 <!DOCTYPE html> <html lang="en"> <head& ...
- Codeforces 545E. Paths and Trees[最短路+贪心]
[题目大意] 题目将从某点出发的所有最短路方案中,选择边权和最小的最短路方案,称为最短生成树. 题目要求一颗最短生成树,输出总边权和与选取边的编号.[题意分析] 比如下面的数据: 5 5 1 2 2 ...
- [UOJ#223][BZOJ4654][Noi2016]国王饮水记
[UOJ#223][BZOJ4654][Noi2016]国王饮水记 试题描述 跳蚤国有 n 个城市,伟大的跳蚤国王居住在跳蚤国首都中,即 1 号城市中.跳蚤国最大的问题就是饮水问题,由于首都中居住的跳 ...
- SPOJ GSS5 Can you answer these queries V ——线段树
[题目分析] GSS1上增加区间左右端点的限制. 直接分类讨论就好了. [代码] #include <cstdio> #include <cstring> #include & ...
- Gdb学习笔记1
其实,从很早就开始接触gdb程序,gdb调试程序伴我成长,现在对其用法记录以下: 当程序的运行结果和预期结果不一致,或者程序出现运行错误时,gdb就可以派上大用处了.调试的基本过程是: -> ...
- linux的内存性能评估
linux的内存性能评估 参考自:自学it网,http://www.zixue.it/. (1)使用free指令监控内存,参数-m以M为单位显示,-h人性化显示单位. [test@localhost ...