Hibernate 包括二个级别的缓存,默认的总是启用Session级别的一级缓存,可选的 SessionFactory 级别的二级缓存,Session级别的一级缓存,但应用保存持久化实体、修改持久化实体时,Session 并不会立即把这种改变 flush 到数据库中,只有程序显示的调用 flush 方法,或者程序关闭 Session 时才会把这些改变一次性的flush到底层数据库。

  1. 开启二级缓存,需要在 hibernate.cfg.xml 配置文件中设置如下属性:

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

    在开启二级缓存后,还需要配置二级缓存的具体实现,Hibernate 提供了三中缓存实现:

    1. ConcurrentHashMap 缓存,实现类为 org.hibernate.testing.cache.CachingRegionFactory,缓存类型为内存(该缓存只用于测试,不推荐实际项目中使用)
    2. EhCache 缓存,实现类为 org.hibernate.cache.ehcache.EhCacheRegionFactory,缓存类型为内存、磁盘、事务性、支持群集
    3. Infinispan 缓存,实现类为 org.hibernate.cache.infinispan.InfinispanRegionFactory,缓存类型为事务性、支持群集

    Hibernate.cfg.xml 配置文件中增加如下属性,设置缓存类型:

    <property name="hibernate.cache.region.factory_class">[缓存的具体实现类]</property>

    要使用 EhCache 缓存,需要复制 Hibernate 目录下的 lib/optional/ehcache 子目录的 jar 包,主要依赖的 jar包如下:

    1. ehcache-core-2.4.3.jar
    2. hibernate-ehcache-4.3.11.Final.jar
    3. slf4j-api-1.6.1.jar
    4. commons-logging-1.2.jar(需要额外下载:http://commons.apache.org/proper/commons-logging/download_logging.cgi)
    5. backport-util-concurrent.jar(需要额外下载:https://sourceforge.net/projects/backport-jsr166/files/latest/download)
  2. 增加配置文件 ehcache.xml 整个配置文件可以在 Hibernate 的 project\etc 路径下找到,示例配置如下:

    <ehcache>

    <diskStore path="java.io.tmpdir"/>

    <defaultCache

    maxElementsInMemory="10000"

    eternal="false"

    timeToIdleSeconds="120"

    timeToLiveSeconds="120"

    overflowToDisk="true"

    />

    </ehcache>

     
     

    配置说明如下:

    1. diskStrore:保存路径配置,path 的值有 user.home(用户的主目录可以使用)、user.dir(用户当前的工作目录)、java.io.tmpdir(默认临时文件路径)
    2. maxElementsInMemory:设置缓存中最多可以放多少个对象
    3. eternal:设置缓存是否永久有效
    4. timeToIdleSeconds:设置缓存对象多少秒没有被使用就会被清理掉
    5. timeToLiveSeconds:设置缓存对象在过期前可以缓存多少秒
    6. overflowToDisk:内存中的缓存已达到 maxInMemory 限制,是否可以溢出到磁盘
    7. diskPersistent:设置缓存对象是否被持久化到硬盘中,保存路径由<diskStore…/>配置决定
    8. diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
    9. diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
    10. memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)、FIFO(先进先出)或是LFU(较少使用)

    修改要使用缓存的持久化类文件,使用 Hibernate 提供的 @Cache 注解修饰持久化类,或者使用该注解修饰集合属性,也可以在 hibernate.cfg.xml 文件中使用<class-cache…/>元素对指定的持久化类启用二级缓存,示例配置及代码如下:

    <class-cache usage="read-only" class="[缓存持久类完成名称]"/>

    二级缓存可以设定以下 4 种类型的并发访问策略, 每一种访问策略对应一种事务隔离级别

    1. nonstrict-read-write(非严格读写):不保证缓存与数据库中数据的一致性,提供 Read Uncommited 事务隔离级别, 对于极少被修改, 而且允许脏读的数据, 可以采用这种策略
    2. read-write(读写型):提供 Read Commited 数据隔离级别.对于经常读但是很少被修改的数据, 可以采用这种隔离类型, 因为它可以防止脏读
    3. Transactional(事务型):仅在受管理环境下适用. 它提供了 Repeatable Read 事务隔离级别. 对于经常读但是很少被修改的数据, 可以采用这种隔离类型, 因为它可以防止脏读和不可重复读
    4. read-only(只读型):提供 Serializable 数据隔离级别, 对于从来不会被修改的数据, 可以采用这种访问策略

     
     

    public static void main(String[] args) {

    Session curSession = hibernateUtils.openSession();

    Calendar calendar = Calendar.getInstance(Locale.CHINA);

    try {

    // 启用了二级缓存,在查询时需要开启事务

    curSession.beginTransaction();

    List list = curSession.createQuery("SELECT trm FROM TransitRecordModel trm").list();

     
     

    System.out.println("Query Size=" + list.size());

    curSession.getTransaction().commit();

    // 从缓存读取,不查询数据库

    TransitRecordModel recordModel = (TransitRecordModel) curSession.load(TransitRecordModel.class,new Integer(259));

    System.out.println("RecordID=" + recordModel.getRecordID());

    } finally {

    if (curSession != null) {

    curSession.close();

    }

    i}

  3. 管理缓存,Session 级别的一级缓存是局部缓存,只对当前Session有效;SessionFactory 级别的二级缓存是全局缓存,他对所有的Session都有效。
    1. Session 级别的一级缓存,所有操作的实体,使用 save、update、saveOrUpate、load、get、 list、iterate或者scroll 返回获取一个对象,改对象都会放入Session级别的一级缓存,在Session 调用 flush 或者 close 方法之前,这些对象一直缓存在一级缓存,如果想提前释放缓存,可以调用Session.evict 方法移除某个缓存,或者Session.clear 清除所有缓存
    2. SessionFactory 级别的二级缓存,如果要对二级缓存进行管理,可以调用 SessionFactory.getCache 方法,获取 cache对象,通过cache的 evictEntity、evictEntityRegion、evictCollection、 evictCollectionRegion 方法来管理缓存
  4. 统计缓存,开启二级缓存的统计功能,可以查询二级缓存的内容并提供了一些工具方法来分析二级缓存的效果
    1. 启用二级缓存的统计,在 hibernate.cfg.xml 文件增加如下配置:

      <!-- 开启二级缓存的统计功能 -->

      <property name="hibernate.generate_statistics">true</property>

      <!-- 设置使用结构化方式来维护缓存项-->

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

    2. 通过调用 SessionFactory 类的 getStatistics 返回 Statistics 类,通过 Statistics类可以访问工具方法,来获取缓存效果

       
       

     
     

笔记:Hibernate 二级缓存的更多相关文章

  1. js相关(easyUI),触发器,ant,jbpm,hibernate二级缓存ehcache,Javamail,Lucene,jqplot,WebService,regex,struts2,oracle表空间

    *********************************************js相关********************************************* // 在指 ...

  2. Hibernate ——二级缓存

    一.Hibernate 二级缓存 1.Hibernate 二级缓存是 SessionFactory 级别的缓存. 2.二级缓存分为两类: (1)Hibernate内置二级缓存 (2)外置缓存,可配置的 ...

  3. 配置Hibernate二级缓存时,不能初始化RegionFactory的解决办法

    配置Hibernate 二级缓存时,出现以下bug提示: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder&quo ...

  4. 配置Hibernate二级缓存步骤

    配置Hibernate二级缓存步骤: 加入二级缓存的jar包及配置文件 jar包位置:hibernate-release-4.1.8.Final\lib\optional\ehcache下所有jar包 ...

  5. Hibernate 二级缓存 总结整理(转)

    和<Hibernate 关系映射 收集.总结整理> 一样,本篇文章也是我很早之前收集.总结整理的,在此也发上来 希望对大家有用.因为是很早之前写的,不当之处请指正. 1.缓存:缓存是什么, ...

  6. Hibernate(十六):Hibernate二级缓存

    Hibernate缓存 缓存(Cache):计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如磁盘上的文件或者数据库)之间,起作用是降低应用程序直接读取永久性数据存储源的频率,从而提高应用 ...

  7. hibernate二级缓存demo2

    @Test public void hello3(){ Session session=sessionFactory.openSession(); List list = session.create ...

  8. hibernate二级缓存整合

    <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http:// ...

  9. ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存

    ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存 hibernate  : Hibernate是一个持久层框架,经常访问物理数据库 ...

  10. spring boot集成ehcache 2.x 用于hibernate二级缓存

    https://www.jianshu.com/p/87b2c309b776 本文将介绍如何在spring boot中集成ehcache作为hibernate的二级缓存.各个框架版本如下 spring ...

随机推荐

  1. mysql数据库 调优

    mysql调优硬件配置网络带宽mysql运行参数慢查询日志网络架构多实例(一台服务器上运行多个数据库服务)分库分表 当一台数据库服务器处理客户端的请求慢时,可能是哪些原因造成? 硬件配置低:(内存 c ...

  2. js数据类型的判断方法

    判断js中的数据类型有一下几种方法:typeof.instanceof. constructor. prototype. $.type()/jquery.type(),接下来主要比较一下这几种方法的异 ...

  3. (2018干货系列五)最新UI设计学习路线整合

    怎么学UI全链路设计 全链路设计师是参与整个商业链条,为每个会影响用户体验的地方提供设计的可解决方案,最后既满足了商业目标,又提升了产品的用户体验和设计质量,与平面设计.UI设计彻底区分开来,是真正的 ...

  4. DAVINCI DM6446 开发攻略——V4L2视频驱动和应用分析

     针对DAVINCI DM6446平台,网络上也有很多网友写了V4L2的驱动,但只是解析Montavista linux-2.6.10 V4L2的原理.结构和函数,深度不够.本文决定把Montavis ...

  5. Conditional Random Fields (CRF) 初理解

    1,Conditional Random Fields

  6. Filter组件开发中的SDK基类分析

    DirectShow SDK提供了一套开发Filter的基类源代码.基于这些基类开发Filter将大大简化开发过程. 1.CBaseObject 大部分SDK类都从CBaseObject类(参见com ...

  7. 表格布局----基于bootstrap样式 布局

    在实际开发中,我们通过菜鸟教程复制的表格往往不能满足我们的开发需求,样式很难看,而且不能自适应,尤其是需要到处Excel的样式,感觉非常糟糕,这次我就写了一个表单,不足之处,希望大神们多多指教: 代码 ...

  8. 如何开发jQuery插件

    一:普及JQuery知识 知识1:用JQuery写插件时,最核心的方法有如下两个: $.extend(object) 可以理解为,为JQuery 类添加一个静态方法. $.fn.extend(obje ...

  9. cookie的设置和获取

    // 创建cookiefunction setCookie(name, value, expires, path, domain, secure) { var cookieText = encodeU ...

  10. java实现取球类的博弈问题

    1.问题描述: 今盒子中有n个小球,A,B两人轮流从盒子中取球,每个人都可以看到对方的取球数目. 规定如下: 取球只能取1,3,7,8四种情况.如果没有球取了,则输了.规定A先取球,给定初始球的数目, ...