文档章节

查询和缓存

猪刚烈
 猪刚烈
发布于 2014/10/12 11:47
字数 749
阅读 10
收藏 1

经过大量的测试,查询和缓存之间的关系已经基本上清楚了。


1. 一次查询过后,结果集中的所有个体都会进入持久化上下文,也就是一级缓存中(如果打开了二级缓存,它们也同样会进入二级缓存)。这就是意味着后面的程序如果要load(不是查询)结果集中的任何一个对象都会从缓存中直接命中,不会生成任何SQL去Hit数据库。


2. 但是作为结果集的整体,在不使用查询缓存的前提下是不会被缓存的。举个例子:当执行一个得到某个班级所有学生的查询后,这个班级所有的学生实例会被加载并进行入缓存中。但是缓存并没有缓存“这些学生都是某一个班级”这层关系!因此,当再次执行这个查询时,依然会生成SQL再次访问数据库。想要缓存查询结果,在这个例子中也就是缓存 “这些学生都是某一个 班级”的这层关系,就得使用查询缓存!对于 查询缓存来说, 构成key的是:hql生成的sql、sql的参数、排序、分页信息等。

 

我想查询不会先从缓存中查找对象的根本原因在于,即使Hibernate发现缓存中有符合条件的 对象 ,但也无法证实这些对象是结果的全集。因为缓存中的数据只是一小部分,所以它必须要生成SQL去数据库中查询。

 

如果使用了“Query Cache”,对一个查询来说,对它的缓存是这样处理的:查询的结果集做为Value,放置于查询缓存的region中。注意:这里存在的并不是真正的结果集。因为查询出来的实例已经放入了二级缓存,所以查询缓存不会重复保存这些实例,而是只保存实例的ID。这一点在JPwH一书的15.4.2中作过解释。对于key,它应该是一个可以用来唯一标识这个查询的东西,在hibernate中查询缓存的key由 hql生成的sql、 sql的参数、排序、分页等信息组成, 通过它我们可以明确地区别不同的查询,以便某个查询在下一次重复执行时可以能过这个key直接命中结果集。

维护查询缓存会对系统带来一定的负荷,因为Hibernate必须追踪结果集中涉及的各类对象是否发生了改动,因为一旦它们发生了改动,这些对象就可能不再是结果集中一员,又或者原来不在结果集中的对象应该进入结果集,这样当前缓存的这个结果集就失效了,必须重新生成SQL进行查询。


本文转载自:http://blog.csdn.net/bluishglc/article/details/5662542

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
私信 提问
Hibernate缓存测试小总结

一级缓存测试: 1.Load测试: 在同一个session中发出两次load查询(1) 2.Get测试: 在同一个session中发出两次get查询(1) 3.iterate测试: 在同一个session中发出两次iterator查询(1(i...

heroShane
2014/03/02
0
0
Hibernate查询缓存全面分析

这里介绍Hibernate查询缓存对Iterator不起作用,只对List起作用。下面我们这种介绍把二级缓存 和 Hibernate查询缓存 结合使用。 AD: 本文向大家介绍Hibernate查询缓存,可能好多人还不了解H...

dong.li
2012/04/24
0
0
MySQL/MariaDB的查询缓存

查询缓存: 缓存的数据:k/v,即键值对; key:查询语句的hash值; value:查询语句的查询结果; 判断缓存是否命中标准: 通过整个查询语句的hash值的比较,完全相同则命中; 有些查询结果是...

刘景宇
07/27
0
0
hibernate三级缓存概括

Hibernate三级缓存 一级缓存(session级别缓存): 1、session关闭后,缓存就没了;hibernate发出一条sql查询,若缓存中没有,则从数据库中查,查到之后放入缓存 2、以id为key值缓存对象 二级...

挨踢精英
2015/10/12
1K
0
hibernate缓存机制详解

hibernate的一级缓存 hibernate是一个线程对应一个session,一个线程可以看成一个用户。也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和线程绑定了。 hi...

偶尔诗文
2015/05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ViewPager+Fragment+FragmentPagerAdapter实现软件主界面

ViewPager之前的页面是由View构成的,现在由Fragment构成,之前的PagerAdapter这里也换成了FragmentPagerAdapter.因为PagerAdapter有 public Object instantiateItem(ViewGroup container, i......

鱼想吃肉
6分钟前
0
0
feign文件上传遇到的坑

明天写

王俊博客
11分钟前
0
0
scala的sorted,sortBy,sortWith

val lst = List(1,3,2,4,5) //scala中对于集合的排序有三种方法:sorted,sortBy,sortWith //sorted方法对一个集合进行自然排序,传递一个Ordering隐式参数 def sorted[B >: A](imp...

whoisliang
26分钟前
0
0
区块链扩容最佳途径?十分钟讲清楚侧链技术

今天我们来讲区块链扩容的另一个主流方案——侧链,侧链可作为解决区块链扩容难题的一种有效解决方案。有些人认为,从理论上说,这种解决方案可让所有人都满意。 基础概念 侧链协议本质上是一...

HiBlock
28分钟前
0
0
3年经验Java程序员面阿里P6 差距在哪里

虽然这位小伙伴觉得自己工作三年了,结果阿里连面都不面就把自己挂了,这让自己感到很伤心。但是还是有网友觉得,三年不到p6,很正常啊,明年再面就没有问题啦! Java程序员3年经验面阿里P6,...

架构师springboot
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部