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分区之range分区

    随着互联网的发展,各方面的数据越来越多,从最近两年大数据越来越强的呼声中就可见一斑. 我们所做的项目虽算不上什么大项目,但是由于业务量的问题,数据也是相当的多. 数据一多,就很容易出现性能问题,而为了 ...

  2. AFDX总线协议规范

    AFDX总线协议规范 1.概述 2. AFDX简介 3.AFDX的在数据传输性能的改进 3.1 AFDX以太网帧格式 3.2 AFDX以太网冗余备份 3.3 虚拟连接 3.4 数据交换处理 4.航空计 ...

  3. Servlet.service() for Servlet jsp threw exception javax.servlet.ServletException:File &quot;/pageFoo

    1.错误描述 Servlet.service() for Servlet jsp threw exception javax.servlet.ServletException:File "/ ...

  4. Flex中创建Accordion报错

    1.错误描述 2.错误原因 <mx:Accordion width="100%" height="100%"> <s:NavigatorCon ...

  5. asp.net URL重新实例

    void Application_Start(object sender, EventArgs e) { // 在应用程序启动时运行的代码 RegisterRoutes(); } // 页面存放目录 ...

  6. directX--关于CSource和CSourceStream (谁调用了fillbuffer)

    CSourceStream类,是CSource类的OutputPin[source.h/source.cpp]派生自CAMThread和CBaseOutputPinl         成员变量: CS ...

  7. Django学习-7-ORM操作

    select * from tb where id > 1    # 对应关系     models.tb.objects.filter(1id__gt=)         models.tb. ...

  8. freemarker字符串转换成日期和时间(十三)

    freemarker字符串转换成日期和时间 1.日期时间转换总结 (1)date用来转换为日期 (2)time用来转换为时间 (3)datetime用来转换为日期和时间 2.展示示例 <#--字 ...

  9. LinkedHashMap和HashMap

    1.HashMap: HashMap里面存入的键值对在取出的时候是随机的,是比较常用的Map.它根据key的HashCode值存储数据,根据key可以直接取出它的值(当然也有冲突的情况,不过遍历链表就 ...

  10. 【BZOJ3143】游走(高斯消元,数学期望)

    [BZOJ3143]游走(高斯消元,数学期望) 题面 BZOJ 题解 首先,概率不会直接算... 所以来一个逼近法算概率 这样就可以求出每一条边的概率 随着走的步数的增多,答案越接近 (我卡到\(50 ...