Hibernate本身只提供了二级缓存的规范,但并未实现,所以需要第三方缓存插件的支持。常用的二级缓存第三方插件有:EHCache、Memcached、OSCache、SwarmCache、JBossCache。这些插件的功能的侧重均有所不同。下面一图说明了插件的在实际应用中的区别:

本例采用EHCache插件。

1、首先,导入需要EHCache插件相关的Jar包。(可通过Hibernate框架的lib\optional\ehcache目录中找到)

2、修改主配置文件hibernate.cfg.xml:

需要开启二级缓以及注册二级缓存工厂,在hibernate.cfg.xml文件中<session-factory>标签中加入以下代码:

<!-- 开启二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 注册二级缓存区工厂 -->
<property name="hibernate.cache.region.factory_class"><!--需要name可在/project/etc目录中的hibernate.properties查找 -->
  org.hibernate.cache.ehcache.EhCacheRegionFactory
</property>

3、添加配置文件ehcache.xml 。

解压ehcache-core-2.4.3.jar

找到ehcacha-failsafe.xml,将其复制到项目中的src目录中,并改名为ehcache.xml

4、再次修改在主配置文件(hibernate.cfg.xml),在主配置文件中指定缓存内容 。

在<mapping/>标签的后面(同样是在<session-factory>标签中)指定类缓存与集合缓存,代码如下:

<!-- 指定类缓存 -->
<class-cache usage="read-only" class="com.beans.Country"/>
<class-cache usage="read-only" class="com.beans.Minister"/>
<!-- 指定集合缓存 -->
<collection-cache usage="read-only" collection="com.beans.Country.ministers"/>

5、以1:n的Country与Minister关联关系为例,演示二级缓存实例。首先,需要插入相关数据,在测试类中写插入数据的方法。

MyTest.java:

@Test
public void test02() {
  Session session = HbnUtils.getSession();
  try {
    session.getTransaction().begin();
    Minister minister1 = new Minister("aaa");
    Minister minister2 = new Minister("bbb");
    Minister minister3 = new Minister("bbb");
    Country country = new Country("America");
    //Country维护关联关系
    country.getMinisters().add(minister1);
    country.getMinisters().add(minister2);
    country.getMinisters().add(minister3);

    session.save(country);
    session.getTransaction().commit();
  } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
    session.getTransaction().rollback();
  }
}

6、证明二级缓存的存在。为了证明二级缓存的存在,我这里是对插入的数据进行同样的3次查询。接着上例在MyTest.java中加入测试二级缓存的方法。

MyTest.java:

@Test
public void test03() {
  Session session = HbnUtils.getSession();
  try {
    session.beginTransaction();
    //第一次查询,将id为1的country对象加载到一级缓存session将引发查询(select语句)
    Country country1 = session.get(Country.class, 1);
    System.out.println("第一次查询:Cname=" + country1.getCname());

    //第二次查询:从session(一级缓存)中直接读取到的id为1的Country对象,不会到数据库中查询,不引发查询
    Country country2 = session.get(Country.class, 1);
    System.out.println("第二次查询:Cname=" + country2.getCname());
    //将一级缓存数据清空,session中Country对象也不存在了
    session.clear();

    //第三次查询,从二级缓存中读取id为1 的Country对象,不会到数据库中查询,不引发查询
    Country country3 = session.get(Country.class, 1);
    System.out.println("第三次查询:Cname=" + country3.getCname());
    session.getTransaction().commit();
  } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
    session.getTransaction().rollback();
  }
}

执行测试方法后,控制台显示如下结果:

明显可以看出,查询只引发了一次,并且是第一次查询所引发的。在第二次查询时,读取的是一级缓存session中的数据,所以不引发。当一级缓存数据被清空后,再次查询也是没有引发的,也就是说第三次查询是从二级缓存中获取的数据,也就证明是二级缓存的存在。

Hibernate二级缓存 --Hibernate框架的更多相关文章

  1. SSH框架搭建步骤总结以及Hibernate二级缓存,查询缓存

    二级缓存.查询缓存 一级缓存: 默认启动,生命周期是和session同步的,session独享 二级缓存: 需要加载配置信息,生命周期是和应用服务器同步,session共享 1:在hibernate. ...

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

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

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

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

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

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

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

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

  6. Hibernate ——二级缓存

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

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

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

  8. 配置Hibernate二级缓存步骤

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

  9. SSH2中memcached作为hibernate二级缓存

    一.安装memcached服务端 1. 下载memcached的windows稳定版,解压放某个盘下面,比如在c:\memcached2. 在CMD下输入 "c:\memcached\mem ...

随机推荐

  1. Codeforces Round #425 (Div. 2) Problem D Misha, Grisha and Underground (Codeforces 832D) - 树链剖分 - 树状数组

    Misha and Grisha are funny boys, so they like to use new underground. The underground has n stations ...

  2. Spring 学习——Spring JSR注解——@Resoure、@PostConstruct、@PreDestroy、@Inject、@Named

    JSR 定义:JSR是Java Specification Requests的缩写,意思是Java 规范提案.是指向JCP(Java Community Process)提出新增一个标准化技术规范的正 ...

  3. POJ 2226 Muddy Fields(最小点覆盖)题解

    题意:一片r*c的地,有些地方是泥地,需要铺地板.这些地板宽1,长无限,但只能铺在泥地上不能压到其他地方,问你铺满所有泥地最少几块 思路:我们把一行中连续的泥地看成整体,并把所有横的整体里的点编成一个 ...

  4. [转]web高级开发的成长之路

    读了这篇文章之后感觉蛮受启发的,在此分享一下,献给和我一样处于困惑的朋友. 正文如下: 本人也是coding很多年,虽然很失败,但也总算有点失败的心得,不过我在中国,大多数程序员都是像我一样,在一直走 ...

  5. BZOJ5479: tree

    Description 给出一棵树,根节点为1 给出两个集合,集合由树上节点组成 从两个集合分别选出一个元素,求其LCA 问LCA的最大深度是多少 Input 第一行给出数据组数T 对于每组数据 第一 ...

  6. P2504 [HAOI2006]聪明的猴子

    思路 最小生成树中最大的边,边权最小 所以这题就变成最小生成树的板子了,跳跃距离大于最大边权的猴子就是可行的 代码 #include <cstdio> #include <algor ...

  7. (转)Awesome Knowledge Distillation

    Awesome Knowledge Distillation 2018-07-19 10:38:40  Reference:https://github.com/dkozlov/awesome-kno ...

  8. spring 配置事务xml

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  9. windows 7 系统下,用户每次登录都是以临时配置文件的形式存在于users文件夹下

    windows 7 系统下,用户每次登录都是以临时配置文件的形式存在于users文件夹下 当用户登录系统后,在users文件夹下创建的是一个临时文件夹,如果当前用户log off,那么当前用户的所有设 ...

  10. video组件的使用

    <video width="100%" height="100%" :src="downloadUrl" controls=" ...