与Session相对的是,SessionFactory也提供了相应的缓存机制。SessionFactory缓存可以依据功能和目的的不同而划分为内置缓存和外置缓存。  SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的副本,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来的。SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义SQL语句,因此SessionFactory不需要进行内置缓存与映射文件的同步。

SessionFactory的外置缓存是一个可配置的插件。在默认情况下,SessionFactory不会启用这个插件。外置缓存的数据是数据库数据的副本,外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓存也被称为Hibernate的二级缓存。由于Hibernate的二级缓存是作用在SessionFactory范围内的,因而它比一级缓存的范围更广,可以被所有的Session对象所共享。

二级缓存的适用范围

Hibernate的二级缓存作为一个可插入的组件在使用的时候也是可以进行配置的,但并不是所有的对象都适合放在二级缓存中。

在通常情况下会将具有以下特征的数据放入到二级缓存中:

●   很少被修改的数据。

●   不是很重要的数据,允许出现偶尔并发的数据。

●   不会被并发访问的数据。

●   参考数据。

在这里特别要注意的是对放入缓存中的数据不能有第三方的应用对数据进行更改(其中也包括在自己程序中使用其他方式进行数据的修改,例如,JDBC),因为那样Hibernate将不会知道数据已经被修改,也就无法保证缓存中的数据与数据库中数据的一致性。

 二级缓存组件

在默认情况下,Hibernate会使用EHCache作为二级缓存组件。但是,可以通过设置hibernate.cache.provider_class属性,指定其他的缓存策略,该缓存策略必须实现org.hibernate.cache.CacheProvider接口。通过实现org.hibernate.cache.CacheProvider接口可以提供对不同二级缓存组件的支持。

Hibernate内置支持的二级缓存组件如表14.1所示。

组件

Provider类

类型

集群

查询缓存

Hashtable

org.hibernate.cache.HashtableCacheProvider

内存

不支持

支持

EHCache

org.hibernate.cache.EhCacheProvider

内存,硬盘

不支持

支持

OSCache

org.hibernate.cache.OSCacheProvider

内存,硬盘

不支持

支持

SwarmCache

org.hibernate.cache.SwarmCacheProvider

集群

支持

不支持

JBoss TreeCache

org.hibernate.cache.TreeCacheProvider

集群

支持

支持

下面我们就使用EhCache配置二级缓存为例,详细介绍一下二级缓存的配置方法 :

1)首先你要把ehcache-1.2.3.jar加入到当前应用的classpath中。

2)然后设置EhCache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下,具体ehcache.xml文件内容如下:

[html] view plaincopyprint?
  1. <?xmlversionxmlversion="1.0" encoding="UTF-8"?>
  2. <ehcache>
  3. <diskStorepathdiskStorepath="java.io.tmpdir"/>
  4. <defaultCache
  5. maxElementsInMemory="10000"<!-- 缓存最大数目 -->
  6. eternal="false"<!-- 缓存是否持久 -->
  7. overflowToDisk="true"<!-- 是否保存到磁盘,当系统当机时-->
  8. timeToIdleSeconds="300"<!-- 当缓存闲置n秒后销毁 -->
  9. timeToLiveSeconds="180"<!-- 当缓存存活n秒后销毁-->
  10. diskPersistent="false"
  11. diskExpiryThreadIntervalSeconds="120"/>
  12. <cache name="com.bzu.hibernate.Student"maxElementsInMemory="200"
  13. eternal="false"
  14. timeToIdleSeconds="50"
  15. timeToLiveSeconds="60"
  16. overflowToDisk="true"/>
  17. </ehcache>

3)配置完上边之后我们就要在Hibernate配置文件中设置,具体配置如下:

[html] view plaincopyprint?
  1. <!-- 设置Hibernate的缓存接口类,这个类在Hibernate包中 -->
  2. <propertynamepropertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
  3. <!-- 是否使用查询缓存 -->
  4. <propertynamepropertyname="hibernate.cache.use_query_cache">true</property>

如果使用spring调用Hibernate的sessionFactory的话,这样设置:

[html] view plaincopyprint?
  1. <!--HibernateSession工厂管理 -->
  2. <beanidbeanid="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  3. <propertynamepropertyname="hibernateProperties">
  4. <!--其他属性省略。。。-->
  5. <props>
  6. <propkeypropkey="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
  7. <propkeypropkey="hibernate.cache.use_query_cache">true</prop>
  8. <propkeypropkey="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
  9. </props>
  10. </property>
  11. <propertynamepropertyname="mappingDirectoryLocations">
  12. <list>
  13. <value>/WEB-INF/classes/cn/rmic/manager/hibernate/</value>
  14. </list>
  15. </property>
  16. </bean>

注意:如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置hibernate.cache.use_query_cache true 才行

如果需要“查询缓存”,还需要在使用Query或Criteria()时设置其setCacheable(true);

配置完上边通用的配置之后,我们接下来要看怎么对特定的实体进行配置二级缓存了,这里的配置其实也很简单,就在对应的hbm文件中配置<cacheusage="read-write"/>就Ok了。我们以一个一对多的配置文件来看一下具体的hbm的配置:

多的一端:

[html] view plaincopyprint?
  1. <hibernate-mapping>
  2. <classnameclassname="com.bzu.hibernate.Student" table="student">
  3. <!--注意:这一句需要紧跟在class标签下面,其他位置无效。 -->
  4. <cacheusagecacheusage="read-write"  region="ehcache.xml中的name的属性值" />
  5. <id name="id" column="id"type="string">
  6. <generatorclassgeneratorclass="uuid"></generator>
  7. </id>
  8. <property name="name" column="name"type="string"></property>
  9. <property name="cardId" column="cardId"type="string"></property>
  10. <property name="age" column="age"type="int"></property>
  11. <many-to-one name="team"class="com.bzu.hibernate.Team"column="team_id"></many-to-one>
  12. </class>
  13. </hibernate-mapping>

一的一端配置:

[html] view plaincopyprint?
  1. <set name="students" inverse="true"fetch="select" lazy="true"cascade="save-update">
  2. <!--注意:这一句需要紧跟在class标签下面,其他位置无效。 -->
  3. <cacheusagecacheusage="read-write"  region="ehcache.xml中的name的属性值" />
  4. <keycolumnkeycolumn="team_id"></key>
  5. <one-to-manyclassone-to-manyclass="com.bzu.hibernate.Student"/>
  6. </set>

hbm文件查找cache方法名的策略:如果不指定hbm文件中的region="ehcache.xml中的name的属性值",则使用name名为com.ouou.model.Videos的cache,如果不存在与类名匹配的cache名称,则用defaultCache。

选择缓存策略依据:
<cache usage="transactional|read-write|nonstrict-read-write|read-only"/>

ehcache不支持transactional其他三种可以支持。
read-only:无需修改, 那么就可以对其进行只读 缓存,注意,在此策略下,如果直接修改数据库,即使能够看到前台显示效果,
但是将对象修改至cache中会报error,cache不会发生作用。另:删除记录会报错,因为不能在read-only模式的对象从cache中删除。
read-write:需要更新数据,那么使用读/写缓存比较合适,前提:数据库不可以为serializable transaction isolation level
(序列化事务隔离级别)
nonstrict-read-write:只偶尔需要更新数据(也就是说两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离,
那么比较适合使用非严格读/写缓存策略。

注:在Spring托管的Hibernate中使用二级缓存

1.在spring的配置文件中,hibernate部分加入 xml 代码org.hibernate.cache.EhCacheProvider true

2.为HBM表设置cache策略 xml 代码

3.在DAO中,调用find方法查询之前,设置使用缓存 Java代码getHibernateTemplate().setCacheQueries(true);

转载于:https://www.cnblogs.com/larryzhang/archive/2012/07/02/2573351.html

Hibernate二级缓存详解相关推荐

  1. Hibernate二级缓存详解(转)

    Hibernate二级缓存详解(转) 本文转载 http://www.blogjava.net/supercrsky/articles/238580.html 与Session相对的是,Session ...

  2. Mybatis二级缓存详解

    Mybatis二级缓存 Mybatis相关全览 一.简介 二.一级缓存 1.入口 2.演示 案例一: 案例二: 3.总结 三.二级缓存 1.入口 2.如何开启二级缓存 cache-ref配置 cach ...

  3. MyBatis 一级缓存二级缓存详解

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) MyBatis 缓存详解 cache 缓存 缓存是一般的ORM 框架都会提供的功能,目的就是提升查询的效率和减少数据库的压力.跟Hibernat ...

  4. hibernate教程--二级缓存详解

    Hibernate的二级缓存 一.缓存概述 缓存(Cache): 计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储 ...

  5. Mybatis的一级缓存和二级缓存详解

    注:本笔记是根据尚硅谷的MyBatis视频记录的 对于任何一个持久层框架,都有缓存机制:缓存在电脑中有一块真实的存储空间(https://baike.baidu.com/item/%E7%BC%93% ...

  6. MyBatis中一级缓存和二级缓存详解

    缓存的作用 首先缓存的合理使用是优化中最常见的,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据的压力,同时提高系统性能. 为什么需 ...

  7. 一级缓存--二级缓存详解

    一级缓存 由于一级缓存的作用域是SqlSession内部,但是SqlSession的生命周期非常短暂,所以一级缓存对于查询效率的提升很有限.而要提升效率,需要使用二级缓存. 二级缓存 1.开启全局开关 ...

  8. cpu二级缓存和一级缓存详解及区别(图解)

    cpu二级缓存和一级缓存详解及区别(图解) 2012-09-02 12:27:55|  分类: 硬件技术 |字号 订阅 处理器缓存的传输速率确实很高,然而还不足以取代内存的地位,这主要是由于缓存只是内 ...

  9. 【大话Hibernate】hibernate缓存详解

    为什么要用hibernate缓存? hibernate是一个持久层框架,经常访问物理数据库.为了降低应用程序对物理数据源访问的次数,从而提高应用程序的运行性能,我们想到使用hibernate缓存机制. ...

最新文章

  1. 思科高级路由与交换(CISCO 部分) 第5天
  2. MMDetection库部署和训练
  3. 编程之美-分层遍历二叉树方法整理
  4. 微服务架构编码构建 环境配置 热部署配置
  5. 合作开发工具——freeze和pipreqs
  6. iText in Action 2nd5.4节(Adding page events to PdfWriter)读书笔记
  7. mac android studio 打不开adb,Android-Macbook ADB无法打开
  8. 【C语言进阶深度学习记录】九 C语言中const的详细分析
  9. Joda-Time几个用法小记
  10. Eclipse利用正则表达式快速去掉注释的方法
  11. Lucene的索引链结构_IndexChain
  12. ncf 推荐系统_TopN物品推荐算法评测设置回顾
  13. 基于Redis的分布式锁安全性分析-转
  14. 三菱PlC程序大型项目QCPU+QD77MS16 宝贝包含一套完整的电气开发系统资料(包含plc程序,触摸屏程序,伺服模块设置程序,程序开发地址规划表)
  15. python自回归模型_向量自回归模型(VAR)到底厉害在哪里?
  16. SPSS学习(三)可靠性(用α系数衡量)
  17. 浅析精益生产中改善活动的8个步骤
  18. win7托盘区没有蓝牙图标
  19. 银河麒麟服务器修改ip,银河麒麟配置DNS服务器
  20. 用Python告诉你深圳房租有多高

热门文章

  1. uniapp在ios端每个页面都可以上下拉,阻止方法
  2. 自制php操作mysql工具类(DB.class.php)
  3. 如何在安装程序中判断操作系统是否是64位 inno
  4. Redis缓存使用技巧
  5. Maven详解之聚合与继承
  6. C++使用命名空间中成员的三种方式
  7. 互联网公司IT系统架构进化之路
  8. 如何“正确”为SharePoint字段命名
  9. [转]30个HTML5学习资源
  10. 解决Debian 9 iwlwifi固件缺失导致无法连接无线网络的问题