`

Hibernate缓存学习笔记

阅读更多
一级缓存(在同一个Session中,缓存实体对象,生命周期与Session一致)
查询实体
  1.执行两次load,get,第二次会从缓存里取
  2.执行两次iterate
   HQL:from Student s where s.id=1
   第一次:
    首先:select student_id from t_student where student_id=1;查询出ID列表
    然后:select * from t_student where student_id=1;根据ID查询实体
   第二次:
    select student_id from t_student where student_id=1;查询出ID列表
    不会发出SQL,因为缓存里有。
  3.先save,后load或get,不会发SQL,因为save后,它会往缓存里放一份
 
查询普通属性
  1.执行两次iterate
   HQL:select s.name from Student s where s.id=1;
   第一次:select name from t_student where id=1;没有放入缓存
   第二次:select name from t_student where id=1;
缓存管理
  一级缓存是无法取消,但可以管理(session.evict(object),session.clear())
  Hibernate导入数据:因为save方法,每执行一次就会往缓存里让一份,所以可以每隔小量数据,
  先session.flush(),然后session.clear(),避免内存溢出。
  如果数据量特别大,可以采用jdbc,如果jdbc也不能满足要求,可采用数据库的专门导入工具
 
二级缓存(进程级缓存,缓存实体对象,生命周期与SessionFactory一致)
配置:1.首先到Hibernate根目录下的etc下的ehcache.xml拷贝到classpath可以搜索到的地方
    它有个默认配置选项
    <defaultCache
   maxElementsInMemory="10000"  //内存中可以存一万个对象
   eternal="false"     //这些对象在内存中不是永久有效的,与下面两个属性是互斥的
   timeToIdleSeconds="120"   //空闲的时间
   timeToLiveSeconds="120"   //缓存对象生命是多长(120秒)
   overflowToDisk="true"   //超过10000个对象时,是否要保存到磁盘上.保存路径为如下
   />
   <diskStore path="java.io.tmpdir"/>  这表示操作系统的临时路径,
   在WINDOWS上为C:\WINDOWS\temp\
    2.在Hibernate.cfg.xml中开启二级缓存将hibernate.cache.use_second_level_cache设置为true
    3.指定缓存产品提供商
    将hibernate.cache.provider_class设置为 org.hibernate.cache.OSCacheProvider
    4.在映射文件中指定缓存策略
   <cache usage="read-only"/>
   也可以在配置文件中指定<class-cache class="com.shadow.Student" usage="read-only"/>
   我个喜欢配置在配置文件中,这样查看比较方便(read-only效率最高,read-write也可以)
查询实体
  1.在两个不同的Session中,get,load,都会使用二级缓存
一级缓存与二级缓存的交互
  session.setCacheMode(CacheMode.GET | CacheMode.PUT | Cache.NORMAL)
 
查询缓存(只有query.list()使用查询缓存,query.list()也只使用查询缓存)
缓存普通属性结果集,对实体对象的结果集只缓存ID,如果当前关联的表发生的修改,那么查询缓存生命周期结束
配置:启用查询缓存 将hibernate.cache.use_query_cache设置为true
  在程序中显式的查询缓存query.setCacheable(true)
  HQL:select s.name from Student s
一.查询普通属性
  1.在同一个Session中,执行两次query.list();
   1>关闭二级缓存,关闭查询缓存,会发两次SQL
   2>关闭二级缓存,打开查询缓存,第一次会发,第二次不会发
  2.开启两个Session,分别调用query.list();
   关闭二级缓存,打开查询缓存,第一次会发,第二次不会发,查询缓存的生命周期与Session无关
  3.开启两个Session,分别调用query.iterate();
   关闭二级缓存,打开查询缓存,两次都会发,查询缓存对query.iterate()方法无效,即query.iterate()
   不使用查询缓存
二.查询实体对象
  1.开启两个Session,分别调用query.list();
   HQL:select s from Student s
   1>关闭二级缓存,关闭查询缓存,会发两次SQL
   2>关闭二级缓存,开启查询缓存,第一次会发一条SQL:select * from t_student
   第二次会发n条SQL,都是根据Id来查询,SQL:select * from t_student where id=?
   因为开启了查询缓存,对于实体对象只会缓存实体Id
   3>开启二级缓存,开启查询缓存,第一次会发,第二次不会发
  2.在同一个Session中,执行两次query.list();
   1>关闭二级缓存,关闭查询缓存,会发两次SQL,因为query.list()只存不取
分享到:
评论

相关推荐

    Hibernate学习笔记

    Hibernate 学习笔记 get和load的区别 一对一,一对多,多对多 悲观锁,乐观锁 hibernate查询语言hql hibernate一级缓存、二级缓存 抓取策略

    Hibernate学习笔记和资料

    hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...

    马士兵hibernate学习笔记(原版)

    目录 课程内容 1 HelloWorld 2 Hibernate原理模拟 - 什么是O/R Mapping以及为什么... 4 一级缓存和二级缓存和査询缓存(面试题)(详见hibernate_3000_Hibernate_3KindsOf_Cache) 5 事务并发处理(面试的意义更大)

    hibernate学习笔记

    Hibernate 学习笔记 Hibernate 学习笔记 1 第一个hibernate项目(hibernate_first) 2 测试实体对象的生命周期(hibernate_session) 3 hibernate基本映射(hibernate_basemapping) 4 class实体类---表 4 标签id 5 ...

    spring hibernate 事务管理学习笔记(二)

    NULL 博文链接:https://microjava.iteye.com/blog/525981

    hibernate笔记

    这是我在学习时记录的hibernate笔记,比较详细。对一些比较琐碎的例如一级二级缓存有较为详细的讲解。

    MyBatis第一天课堂笔记.docx

    门槛高在怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate缓存与数据加载策略方面需要你的经验和能力都很强才行。国内目前前的情况精通hibernate技术大牛非常少。 3. sql优化方面,...

    Java学习笔记-个人整理的

    \contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...

    mybatis学习笔记

    1.6.9 与hibernate不同 16 2 Dao开发方法 16 2.1 需求 16 2.2 SqlSession的使用范围 17 2.2.1 SqlSessionFactoryBuilder 17 2.2.2 SqlSessionFactory 17 2.2.3 SqlSession 17 2.3 原始Dao开发方式 18 2.3.1 映射文件...

    Java_HibernateDemoDay1

    第1章 Hibernate_day01 笔记 1.1 Hibernate 框架的学习 路线 第一天:Hibernate 的入门(Hibernate 的环境搭建、Hibernate 的API、Hibernate 的 CRUD) 第二天:Hibernate 的一级缓存、其他的 API 第三天:Hibernate...

    javaweb笔记.pdf

    * JavaWeb开发的缺点:学习曲线陡峭、资源占用高、性能不高。 二、JavaWeb开发技术 * HTML/CSS:基本的Web页面结构和样式语言。 * JavaScript:一种 Script 语言,用于实现Web页面的交互性。 * Servlet:JavaEE的...

    springboot信息化在线教学平台的设计与实现.zip

    技术栈方面,除了Spring Boot作为主要后端框架外,该项目可能还使用了如MyBatis或Hibernate的ORM框架,MySQL或PostgreSQL作为数据库,Redis用于缓存,以及前端技术如AngularJS、React或Vue.js等。该资源包适合软件...

    learning-notes:学习一些东西

    哨兵模式和Redis-Cluster集群)2.Redis内存回收机制3.Redis笔记4.Redis Cluster原理5.Redis锁6.Redis分库分表分库分表网络1.https原理2.TCP与UDPMyBatis一级与二级缓存hibernate一级与二级缓存Spring1.循环依赖MySQL...

    jive.chm

    2 jcs学习笔记 3 关于Hibernate的Cache问题 4 用缓冲技术提高JSP应用的性能和稳定性 5 SwarmCache入门 &lt;br&gt; 源代码研究 1 Jive中的全局配置 2 Jive源代码情景分析-index....

Global site tag (gtag.js) - Google Analytics