当前位置: 首页 > news >正文

Hibernate二级缓存详解

  • 转自: http://myoraclex.blog.51cto.com/2288027/413175
    hibernate中提供了两级Cache,第一级别的缓存是 Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存 由hibernate管理的一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于 进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。 Hibernate还为查询结果提供了一个 查询缓存,它依赖于第二级缓存
    • 一级缓存的管理:
      当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的 list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。 Session为应用程序提供了两个管理缓存的方法: evict(Object obj):从缓存中清除参数指定的持久化对象。 clear():清空缓存中所有持久化对象。
       Hibernate二级缓存的管理:
      1. Hibernate二级缓存策略的一般过程如下
      1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。
      2) 把获得的所有数据对象根据ID放入到第二级缓存中。
      3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。
      4) 删除、更新、增加数据的时候,同时更新缓存。
      Hibernate二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query Cache。
      2. 什么样的数据适合存放到第二级缓存中? 
      1) 很少被修改的数据 
      2) 不是很重要的数据,允许出现偶尔并发的数据 
      3) 不会被并发访问的数据 
      4) 参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。
      3. 不适合存放到第二级缓存的数据? 
      1) 经常被修改的数据 
      2) 财务数据,绝对不允许出现并发 
      3) 与其他应用共享的数据。
      4. 常用的缓存插件 
      Hibernater二级缓存是一个插件,下面是几种常用的缓存插件:
      ◆EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。
      ◆OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。
      ◆SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。
      ◆JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。
      5. 配置Hibernate二级缓存的主要步骤
      1) 选择需要使用二级缓存的持久化类,设置它的命名缓存的并发访问策略。这是最值得认真考虑的步骤。
      2) 选择合适的缓存插件,然后编辑该插件的配置文件。

    对于经常使用的查询语句,如果启用了查询缓存,当第一次执行查询语句时,hibernate会把查询结果存放在第二级缓存中,以后再次执行该查询语句时, 只需从缓存中获得查询结果,从而提高查询性能。如果查询结果中包含实体,第二级缓存只会存放实体的OID,而对于投影查询,第二级缓存会存放所有的数据 值。
    查询缓存适用于以下场合:在应用程序运行时经常使用的查询语句;很少对与查询语句关联的数据库数据进行插入,删除,更新操作。

    对查询语句启用查询缓存的步骤如下:
    1,配置第二级缓存。
    2,在hibernate的配置文件中设置查询缓存属性:hibernate.cache.use_query_cache=true
    3,即使设置了缓存,在执行查询语句时仍然不会启用查询缓存,只有在调用query.setCacheable()后才启用缓存:
    Query query = session.createQuery("from Customer c where c.age > :age");
    query.setInteger("age", age):
    query.setCacheable(true);
    如果希望更加精粒度地控制查询缓存,可以设置缓存区域:query.setCacheRegion("customerQueries");
    hibernate提供了3种和查询相关的缓存区域:
    1,默认的查询缓存区域:net.sf.hibernate.cache.StandardQueryCache。
    2,用户自定义的查询缓存区域:如customerQueries。
    3,时间戳缓存区域:net.sf.hibernate.cache.UpdateTimestampCache。
    默认的查询缓存区域以及用户自定义的查询缓存区域都用于存放查询结果,而时间戳缓存区域存放了对于查询结果相关的表进行插入,更新,删除操作的时间戳。 hibernate通过时间戳缓存区域来判断被缓存的查询结果是否过期。当应用进程对数据库的相关数据做了修改,hibernate会自动刷新缓存的查询 结果。但是如果其它应用进程对数据库的相关数据做了修改,hibernate无法监测到这一变化,此时必须由应用程序负责监测这一变化(如通过发送和接收 事件或消息机制),然后手工刷新查询结果。
    Query.setForceCacheRefresh(true)方法允许手工刷新查询结果,它使得hibernate丢弃查询缓存区域中己有的查询结果,重新到数据库中查询数据,再把查询结果存放在查询缓存区域中。

    下面是比较hibernate的一级缓存和二级缓存


相关文章:

  • es6学习笔记一数组(下)
  • java的内省机制
  • 用反射和内省技术实现简单 SpringIOC
  • [杂谈]Executor-1
  • spring中的设计模式
  • SpringMVC+RestFul详细示例实战教程
  • Struts工作原理
  • 【git】git知识梳理(一):基本操作远程控制分支管理
  • Java 反射机制模拟hibernate实现持久化
  • JNDI是什么?
  • OI队测题解:
  • JDBC使用总结
  • freeCodeCamp:Convert HTML Entities
  • JDBC中驱动加载的过程分析(上)
  • JavaScript--substring 和 substr 方法手记
  • 【译】理解JavaScript:new 关键字
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Android 控件背景颜色处理
  • extract-text-webpack-plugin用法
  • fetch 从初识到应用
  • Js基础知识(一) - 变量
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • python3 使用 asyncio 代替线程
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Spark RDD学习: aggregate函数
  • 测试如何在敏捷团队中工作?
  • 力扣(LeetCode)965
  • 如何利用MongoDB打造TOP榜小程序
  • 使用parted解决大于2T的磁盘分区
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 说说动画卡顿的解决方案
  • 算法-插入排序
  • 算法-图和图算法
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 我与Jetbrains的这些年
  • 学习HTTP相关知识笔记
  • 自定义函数
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (C语言)fgets与fputs函数详解
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (第一天)包装对象、作用域、创建对象
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (全注解开发)学习Spring-MVC的第三天
  • (三)mysql_MYSQL(三)
  • (未解决)macOS matplotlib 中文是方框
  • (转载)虚函数剖析
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .Net 4.0并行库实用性演练
  • .Net IOC框架入门之一 Unity
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @Bean, @Component, @Configuration简析