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. JS事件覆盖问题和触发问题

    昨天遇到一个面试题,主要就是事件覆盖问题和触发问题 (不是打广告,无视文本内容) 总之这样的话,会输出三次“做自己的网站”. 为什么不是两次,而是输出三次呢? 1.首先onclick=function ...

  2. bzoj 3122 随机数生成器 - BSGS

    Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数.   接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. ...

  3. noip模拟【ping】

    70:很容易想到的是枚举每一个可能的答案来判断是否可行,取最优即可,贪心选择. 100:满足题目条件的这个距离是满足单调性的.如果x不行,那么大于x的距离都不行,二分答案. 学会运用二分,by ws_ ...

  4. linux下gzip的压缩详解

    Linux压缩保留源文件的方法: gzip -c filename > filename.gz Linux解压缩保留源文件的方法: gunzip -c filename.gz > file ...

  5. java 之 dom4j解析xml

    *dom4j,是一个组织,针对xml解析,提供解析器dom4j *dom4j不是javase的一部分,想要使用需要导入dom4j提供的jar包 *第一步:创建lib文件夹,将压缩文件放到此处 *第二步 ...

  6. Multi-attention Network for One Shot Learning

    Multi-attention Network for One Shot Learning 2018-05-15 22:35:50  本文的贡献点在于: 1. 表明类别标签信息对 one shot l ...

  7. UI、JS框架----Bootstrap、Metro

    Bootstrap Datagrid EasyUI Metro bootstrap Datepicker Editable for Bootstrap:bootstrap-editable.js X- ...

  8. 51nod1057-N的阶乘(大数乘法巧解)

    这道大数乘法开始我是想套板子模拟的..然后就发现2/3的例子都wa了.(惊了).然后在思考后发现n2的板子的确过不了这么多的大数.(不看题的下场).所以,我在网上发现了分块求大数的方法.%%% 思路来 ...

  9. 在Idea创建Spring Boot + MyBatis的web项目

    创建步骤如下 选择Spring initializr  2. 修改group 与 atifact id,点击next 3. dependencies里面选择Web->Web , SQL -> ...

  10. Selenium 库

    自动化测试工具,支持多种浏览器.爬虫中主要用来解决JavaScript渲染问题. 用法 基本使用 from selenium import webdriver #浏览器驱动对象 from seleni ...