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. Java网络通信方面,BIO、NIO、AIO、Netty

    码云项目源码地址:https://gitee.com/ZhangShunHai/echo 教学视频地址:链接: https://pan.baidu.com/s/1knVlW7O8hZc8XgXm1dC ...

  2. QML手动连接信号槽【Connections】

    1.使用Connections import QtQuick 2.6 import QtQuick.Window 2.2 import QtQuick.Controls 1.4 Window { vi ...

  3. Delphi程序的主题(Theme)设置

    本文参考了 http://superlevin.ifengyuan.tw/delphi-change-vcl-style/ 在项目的工程文件中勾选主题,设置缺省主题为Windows 部分代码如下: u ...

  4. 第一次怎么把本地git仓库的内容push到远程仓库?

    使用git push origin <分支名> -f 这种方式可以用本地仓库的内容覆盖远程仓库.

  5. Ubuntu 18.04 休眠后无法唤醒的解决办法

    解决办法:安装laptop-mode-tools工具包. 1.检查是否安装了grep laptop-mode-tools 工具包 $ dpkg -l | grep laptop-mode-tools ...

  6. Spyder 调出绘图界面

    Tools->Preference->IPython console->Graphics->Graphics backend->QT4 or QT5

  7. 第五个神奇的电梯(代码抢先看<1>)

    关于一些自认为比较独特的设计思路,也不知道是好还是坏,放在这里让大家一起看一下. 关于mian函数:因为采用了注册机制所以主函数比较简单. #include "stdafx.h" ...

  8. dynamic web module讲解

    一.java的web系统有多种类型,比如静态的和动态的,然后动态的java web project要设置dynamic web module,也就是动态网页模型,他必须要和对应的服务器搭配好了才能跑, ...

  9. Ubuntu 14.04 上安装 Gurobi

    参考: Installing Gurobi 7 on Linux Ubuntu 14.04 上安装 Gurobi 1.在gurobi上创建一个账户,并登陆: 2.从gurobi optimizer上下 ...

  10. 创建react项目

    npm搭建React项目 React官网提供最简便的方法是使用create-react-app npx create-react-app my-app cd my-app npm start 也可以自 ...