文档章节

查询和缓存

猪刚烈
 猪刚烈
发布于 2014/10/12 11:47
字数 749
阅读 9
收藏 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查询缓存全面分析

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

dong.li
2012/04/24
0
0
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三级缓存 一级缓存(session级别缓存): 1、session关闭后,缓存就没了;hibernate发出一条sql查询,若缓存中没有,则从数据库中查,查到之后放入缓存 2、以id为key值缓存对象 二级...

挨踢精英
2015/10/12
1K
0
MySQL/MariaDB的查询缓存

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

刘景宇
07/27
0
0
SSM框架之MyBatis3专题4:查询缓存

查询缓存的使用,主要是为了提高查询访问速度。将用户对同一数据的重复查询过程简化,不再每次均从数据库中查询获取结果数据,从而提高访问速度。 MyBatis的查询缓存机制,根据缓存区的作用域...

糖醋白糖
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java IO类库之PrintStreamWriter

* A <code>PrintStream</code> adds functionality to another output stream, * namely the ability to print representations of various data values * conveniently. Two other fea......

老韭菜
56分钟前
0
0
qduoj~前端~二次开发~笔记

青岛大学qdu的onlinejudge是js的写的前端,框架是vue.js,在nodejs上部署运行,其实整体运行还是建立在docker的容器虚拟环境里,这里暂时不需要docker。安装环境是Ubuntu14-64bit 1.安装一大...

虚拟世界的懒猫
今天
6
0
ConcurrentHashMap源码解读

部分内容转自:http://jiabinyuan.xyz/#/app/archive/detail/25 内部结构 内部采用了segment结构,每一个segment相当于一个hashtable。看下面的结构图: 从图的结构我们可以了解到,Concurr...

edwardGe
今天
1
0
Ubuntu终端Tab键自动补全

打开 /etc/bash.bashrc,找到下列代码,取消注释。 #enable bash completion in interactive shells#if ! shopt -oq posix; then# if [-f /usr/share/bash-completion/bash_compl......

大熊猫
今天
0
0
polipo socks5代理转http代理

天朝的网络,哎~ 装个 yarn 都时而会卡 假设在SSlocal 已经装好运行的前提下,来安装设置 polipo sudo apt-get install polipo sudo vim /etc/polipo/config 追加下列配置内容,并保存 socksP...

纯洁徐
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部