Hibernate 的应用6 —— 二级缓存

Hibernate 二级缓存

Hibernate 二级缓存 总结整理

  • 可以在进程或集群的级别上为事务之间可重用的数据提供二级缓存
  • SessionFactory 的二级缓存是全局性的,所有 Session 都共享这个二级缓存。默认关闭
  • 查询时使用缓存的实现过程为:首先查询一级缓存中是否具有需要的数据,如果没有,查询二级缓存,如果二级缓存中也没有,此时再执行查询数据库的工作
  • Hibernate 并不为二级缓存提供实现方法,而是为 Hibernate 第三方缓存插件整合了接口
  • 可以为每一个 持久化类 或每一个 集合 进行二级缓存的配置
  • 删除、更新、增加数据的时候,同时更新缓存。Hibernate 二级缓存策略,是针对于 ID 查询的缓存策略,对于条件查询则毫无作用,为此,Hibernate 提供了针对条件查询的Query Cache 查询缓存
  • 二级缓存的并发访问策略
    • 事务型:隔离级别最高 —— 适用于经常被读,很少修改的数据。可以防止脏读和不可重读的并发问题
    • 读写型:提供了 Read Commited 事务隔离级别 —— 适用于经常被读,很少修改的数据。可以防止脏读
    • 非严格读写型:适用于应用程序只是偶尔更新的数据
    • 只读型:隔离级别最低 —— 适用于重来不会修改的数据
  • 适合放置在二级缓存的数据
    • 很少被修改的数据
    • 不是很重要的数据,允许出现偶尔并发的数据
    • 不会被并发访问的数据
    • 参考数据 —— 指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改
  • 不适合存放到第二级缓存的数据
    • 经常被修改的数据
    • 财务数据,绝对不允许出现并发
    • 与其他应用共享的数据
  • 二级缓存的使用
    • 添加对应的二级缓存 jar 包
    • Hibernate 配置文件
      <!-- 开启二级缓存 -->
      <property name="hibernate.cache.use_second_level_cache">true</property>
      <!-- 设置二级缓存实现类 -->
      <!-- 常见的有 EhCache 、OSCache 、SwarmCache 、JBossCache 等 -->
      <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
      
    • 选择需要使用二级缓存的持久化类,设置它的命名缓存的并发访问策略
      在映射文件中,在 <class> 的子元素下添加
      <!-- 配置二级缓存 -->
      <!-- usage 属性,指二级缓存策略,有:read-only / read-write / nonstrict-read-write(不严格读写缓存) / transcational(事务性缓存) -->
      <!-- region 属性,指定二级缓存的去域名,默认为类或者集合的名字 -->
      <!-- include 属性,all 包含所有属性,non-lazy 仅包含非延迟加载的属性 -->
      <cache usage="read-only" />
      
    • 新建缓存配置文件:ehcache.xml
      <ehcache>
          <!-- Sets the path to the directory where cache .data files are created.
      
               If the path is a Java System Property it is replaced by
               its value in the running VM.
      
               The following properties are translated:
               user.home - User's home directory
               user.dir - User's current working directory
               java.io.tmpdir - Default temp file path -->
          <diskStore path="/Users/slw/Documents/"/>
      
      
          <!--Default Cache configuration. These will applied to caches programmatically created through
              the CacheManager.
      
              The following attributes are required for defaultCache:
      
              maxInMemory       - Sets the maximum number of objects that will be created in memory
              eternal           - Sets whether elements are eternal. If eternal,  timeouts are ignored and the element
                                  is never expired.
              timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used
                                  if the element is not eternal. Idle time is now - last accessed time
              timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used
                                  if the element is not eternal. TTL is now - creation time
              overflowToDisk    - Sets whether elements can overflow to disk when the in-memory cache
                                  has reached the maxInMemory limit.
      
              -->
          <defaultCache
              maxElementsInMemory="10000"
              eternal="false"
              timeToIdleSeconds="120"
              timeToLiveSeconds="120"
              overflowToDisk="true"
              />
      
          <!--Predefined caches.  Add your cache configuration settings here.
              If you do not have a configuration for your cache a WARNING will be issued when the
              CacheManager starts
      
              The following attributes are required for defaultCache:
      
              name              - Sets the name of the cache. This is used to identify the cache. It must be unique.
              maxInMemory       - Sets the maximum number of objects that will be created in memory
              eternal           - Sets whether elements are eternal. If eternal,  timeouts are ignored and the element
                                  is never expired.
              timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used
                                  if the element is not eternal. Idle time is now - last accessed time
              timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used
                                  if the element is not eternal. TTL is now - creation time
              overflowToDisk    - Sets whether elements can overflow to disk when the in-memory cache
                                  has reached the maxInMemory limit.
      
              -->
      
          <!-- Sample cache named sampleCache1
              This cache contains a maximum in memory of 10000 elements, and will expire
              an element if it is idle for more than 5 minutes and lives for more than
              10 minutes.
      
              If there are more than 10000 elements it will overflow to the
              disk cache, which in this configuration will go to wherever java.io.tmp is
              defined on your system. On a standard Linux system this will be /tmp"
              -->
          <cache name="com.lian.entity.Account"
              maxElementsInMemory="10000"
              eternal="false"
              timeToIdleSeconds="300"
              timeToLiveSeconds="600"
              overflowToDisk="true"
              />
      
           <!-- 设置默认的查询缓存区域的属性 -->
          <cache name="org.hibernate.cache.StandardQueryCache" 
              maxElementsInMemory="50"
              eternal="false" 
              timeToIdleSeconds="3600" 
              timeToLiveSeconds="7200" 
              overflowToDisk="true"/>
          <!-- 设置时间戳缓存区域的属性 -->
          <cache name="org.hibernate.cache.UpdateTimestampsCache" 
              maxElementsInMemory="5000"
              eternal="true" 
              overflowToDisk="true"/> 
          <!-- 设置自定义命名查询缓存区域的属性,一般可不配置 -->
          <cache name="myCacheRegion"
              maxElementsInMemory="1000"
              eternal="false"
              timeToIdleSeconds="300"
              timeToLiveSeconds="600"
              overflowToDisk="true"/>
      </ehcache>
      

查询缓存

  • 对于某个条件查询语句经常使用相同的条件值进行查询,就可以启用查询缓存

  • 只有当经常使用同样的参数值进行条件查询时,才起作用(查询缓存缓存的 key 为 hql 或 sql )。所以,大多数查询没有必要使用查询缓存

  • 查询缓存的使用

    • Hibernate 配置文件
      <!-- 打开查询缓存 -->
      <property name="hibernate.cache.use_query_cache">true</property>
      
    • 使用
      // 条件查询
      String hql="from Account where name like :lname";
      Query query=session.createQuery(hql);
      query.setString("lname", "zhang%");
      
      // 启用查询缓存
      query.setCacheable(true);
      
      //指定所使用的查询缓存策略
      query.setCacheRegion("myCacheRegion");
      
      List<Account> list=(List<Account>)query.list();
      
  • SessionFactory 对象的 getCache 方法返回一个 Cache 对象

  • 开启二级缓存的统计功能

    • 在 Hibernate 的配置文件中添加
      <property name="hibernate.generate_statistics">true</property>
      <property name="hibernate.cache.use_structured_entries">true</property>
      
    • sessionFactory.getStatistics().getSecondLevelCacheStatistics("持久化类完整路径") 方法返回的对象提供一些工具可分析二级缓存效果

在 JTA 环境使用缓存策略(未完成)

在集群环境使用缓存策略(未完成)

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

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 3,785评论 0 11
  • Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库...
    兰缘小妖阅读 1,195评论 1 18
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,422评论 0 4
  • 这部分主要是开源Java EE框架方面的内容,包括Hibernate、MyBatis、Spring、Spring ...
    杂货铺老板阅读 1,340评论 0 2