二级缓存&查询缓存

属于SessionFactory级别的缓存,可以在多个session之间共享数据。

image.png

实用场合

      1.公开的数据, 数据基本上不发生变化
      2.该数据保密性不是很强
      3.需要引入第三 方的缓存工具,如 EhCache 等。

生命周期
二级缓存的生命周期和sessionFactory是一致的。

开发流程
1.1. 第一步:开启二级缓存

别忘记依赖


image.png

在核心配置hibernate.cfg.xml新增

<property name="hibernate.cache.use_second_level_cache">true</property>

启用二级缓存,hibernate 二级缓存是一个规范接口,没有实现

1.2. 第二步:指定二级缓存实现厂商
在核心配置hibernate.cfg.xml新增,实现厂商。
设置二级缓存的供应商 Idea中没有这个key的提示需手动输入


<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

1.3. 第三步:在映射文件中开启具体的缓存支持
*.hbm.xml中指定哪个类开启二级缓存

image.png

二级缓存一般设置为只读
二级缓存缓存的仅仅是对象,如果查询出来的是对象的一部分属性(返回Object[]),则不会加到缓存中去。

1.4. 第四步:开发

第一次查询,从DB取记录,关闭Session.第二次新 session查询,没有走DB,直接从二级缓存取得记录。

public void testTwoCache(){
Session session1 = HibernateUtils.openSession();
Session session2 = HibernateUtils.openSession();
BookTypeEntity bookTypeEntity = session1.get(BookTypeEntity.class, 31L);
System.out.println(bookTypeEntity.getTypeName());
session1.close();
//第二次查询 走二级缓存,不查DB
BookTypeEntity bookTypeEntity2 = session2.get(BookTypeEntity.class, 31L);
System.out.println(bookTypeEntity2.getTypeName());
session2.close();

}

注意:这里的POJO可以不用序列化。但是如果这个对象需要存储到具体的硬盘中的时候,是需要序列化。

注意:测试二级缓存需要保持关联表为默认的延迟检索机制lazy=true,因为加载关联表二级缓存支持不够。

不足: 二级缓存对于立即加载的支持还是很差的


image.png

测试:


image.png

现象:
第二次查询还是发生的SQL查询。

二级缓存不足:

1,非对象不存储
查询返回的不是对象,下面的HQL不会加载到二级缓存
Select stuName from StudentInfo

2,关联支持不太好
二级缓存,不能很好解决关联表问题。需要把所有关联的地方改为默认的延迟检索,不找关联表。
主要是主表的二级缓存需保持默认lazy="true“
若关联表两边都设置为false,部分到二级缓存,有不成功的地方。
测试:session.get(BookInfo.class, 18L)

image.png

3,不支持Query查询
from BookInfo where bookId=:bookId
两次都是从数据库找记录

查询缓存

也是二级缓存,支持Query
查询缓存也是sessionFactory级别的缓存:需要在二级缓存设置的基础上添加
只有当HQL语句完全相同,参数设置也相同才生效
生命周期:只要一些数据放入到查询缓存中,该缓存会一直存在,直到缓存中的数据被修改了,该缓存的生命周期就结束了。

2.1. 第一步:前提条件
同上,必须先配置二级缓存

2.2. 第二步:开启查询缓存
在核心配置Hibernate.cfg.xml中加入

<property name="hibernate.cache.use_query_cache">true</property>

2.3. 第三步:开发的时候需要设置查询缓存
HQL语句后设置开启
query.setCacheable(true);//开启查询缓存
注意保持默认的lazy=true(避免关联)
代码:

public void testQueyCache(){
Session session1 = HibernateUtils.openSession();
Session session2 = HibernateUtils.openSession();
String hql = "from BookTypeEntity where typeId=:tid";
Query<BookTypeEntity> query = session1.createQuery(hql, BookTypeEntity.class);
query.setParameter("tid",31L);
//开启查询缓存
query.setCacheable(true);
BookTypeEntity singleResult = query.getSingleResult();//获取单条记录
System.out.println(singleResult.getTypeName());
session1.close();
//第二次查询
Query<BookTypeEntity> query2 = session2.createQuery(hql, BookTypeEntity.class);
query2.setParameter("tid",31L);
//开启查询缓存
query2.setCacheable(true);
BookTypeEntity singleResult2 = query2.getSingleResult();//获取单条记录
System.out.println(singleResult2.getTypeName());
session2.close();

}

若修改数据或修改HQL的参数,查询缓存不生效.
查询缓存就是让Query可以从二级缓存获得内容。仅主表非关联信息。
必须保持默认的延迟检索方式。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容

  • 一、Hibernate查询 查询概述Get/load主键查询对象导航查询HQL查询 : Hibernate Qu...
    奋斗的老王阅读 848评论 0 51
  • Hibernate: 一个持久化框架 一个ORM框架 加载:根据特定的OID,把一个对象从数据库加载到内存中OID...
    JHMichael阅读 1,963评论 0 27
  • Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库...
    兰缘小妖阅读 1,200评论 1 18
  • 尺有所短,寸有所长,永远抱一颗谦卑的心,才能让自己更加完善。人生没有完美,只有完善;岁月没有十全十美,只有尽量。 ​​​
    宛若骄阳阅读 135评论 0 0
  • 回想一下自己17年6月来深圳前,好像从来没有感觉到寂寞,除了发烧卧床有点昏沉时觉得无助的寂寞外,似乎从来不觉得寂寞...
    Shakuntala阅读 283评论 0 0