在Hibernate中提供了两种缓存来提升程序的性能,分别为一级缓存和二级缓存,也称为内置缓存和外置缓存。

一级缓存在Session中实现,当Session关闭时一级缓存就失效了。我们来看一个使用了来一级缓存的示例:

Session session = factory.openSession();
Student stu = (Student) session.get(Student.class, 21L);
Student stu2 = (Student) session.get(Student.class, 21L);
session.close();
 

我们在同一个Session中使用get方法获取同一个对象两次,当代码运行时,控制台只输出一条SQL语句,这就证明了一级缓存的作用,通过Session对象的contains方法来判断一个对象是否在一级缓存中。

Session session = factory.openSession();
Student stu = (Student) session.get(Student.class, 21L);
System.out.println(session.contains(stu));
Student stu2 = (Student) session.get(Student.class, 21L);
System.out.println(session.contains(stu2));
session.close();
 
在Session中还提供了clear方法,用于将一级缓存中的所有对象进行清除。使用evict方法将指定的对象从一级缓存中清除。
 
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Student stu = (Student) session.get(Student.class, 21L);
session.evict(stu);  //将stu从一级缓存中清除
Student stu2 = (Student) session.get(Student.class, 21L);
session.close();
 

上面的代码中由于将stu从一级缓存中清除,所以在控制台中会产生两条SQL语句。一级缓存由Hibernate来进行维护,一般不需要我们使用手工干预。

在Hibernate中二级缓存在SessionFactory中实现,由一个SessionFactory的所有Session实例所共享。Session在查找一个对象时,会首先在自己的一级缓存中进行查找,如果没有找到,则进入二级缓存中进行查找,如果二级缓存中存在,则将对象返回,如果二级缓存中也不存在,则从数据库中获得。

Hibernate并未提供对二级缓存的产品化实现,而是为第三方缓存组件的使用提供了接口,当前Hibernate支持的第三方二级缓存的实现如下:

EHCache

OSCache

SwarmCache

JBossTreeCache

在使用二级缓存之前需要进行一些配置(以EHCache为例)。首先将Hibernate开发包中lib目录下的ehcache-1.2.jar放到工程的build Path中。然后在Hibernate的配置文件hibernate.cfg.xml中添加如下配置项:

<property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider
</property>
 

在工程的classPath中建立EHCache的配置文件ehcache.xml。

<ehcache><diskStore path="java.io.tmpdir"/><defaultCachemaxElementsInMemory="10000"  ①eternal="false"  ②timeToIdleSeconds="120"  ③timeToLiveSeconds="120"  ④overflowToDisk="true"  ⑤/>
</ehcache>

① 缓存中最大允许保存的对象数量。

② 缓存中数据是否为常量。

③ 缓存数据钝化时间,单位为秒。

④ 缓存数据生存时间,单位为秒。

⑤ 内存不足时,是否启用磁盘缓存。

在需要进行二级缓存的持久化对象的映射文件中指定缓存的同步策略。

<hibernate-mapping>
<class name="com.zhaolongedu.vo.Student" table="t_student"><cache usage="read-only"/>  ①…
</class>
</hibernate-mapping>

① 指定缓存的同步策略。不同的缓存实现,对缓存的同步策略的支持也是不相同的。EHCache支持以下三种同步策略:

1. read-only:只读。对于不会发生改变的数据,可以使用只读性缓存。

2. read-write:可读写缓存。用于对数据同步要求严格的情况。

3. nonstrict-read-write:如果程序对并发访问下的数据同步要求不是很严格,且数据更新操作不频繁时可采用该缓存策略。

用下面的示例演示二级缓存的作用:

public static void main(String[] args) {Configuration config = new Configuration();config.configure();SessionFactory factory = config.buildSessionFactory();Session session = factory.openSession();Student stu = (Student) session.get(Student.class, 21L);session.close();Session session2 = factory.openSession();Student stu2 = (Student) session2.get(Student.class, 21L);session2.close();
}

程序的运行结果是输出一条SQL语句,说明二级缓存设置生效。SessionFactory对象中的evict用于将指定对象从二级缓存中删除。

Session session = factory.openSession();
Student stu = (Student) session.get(Student.class, 21L);
session.close();factory.evict(Student.class);Session session2 = factory.openSession();
Student stu2 = (Student) session2.get(Student.class, 21L);
session2.close();

此时上面的代码执行结果为输出两条SQL语句。

Hibernate缓存相关推荐

  1. Hibernate缓存原理与策略 Hibernate缓存原理:

    Hibernate缓存原理: 对于Hibernate这类ORM而言,缓存显的尤为重要,它是持久层性能提升的关键.简单来讲Hibernate就是对JDBC进行封装,以实现内部状态的管理,OR关系的映射等 ...

  2. Hibernate 缓存机制

    转载:http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html 一.why(为什么要用Hibernate缓存?) Hibernate是一个 ...

  3. Hibernate 缓存

    我这里使用的是Hibernate5.2.0版本 Hibernate缓存分为一级缓存(有的也叫Session缓存)和二级缓存. 一级缓存(Session) 一级缓存的生命周期和session的生命周期一 ...

  4. 【大话Hibernate】hibernate缓存详解

    为什么要用hibernate缓存? hibernate是一个持久层框架,经常访问物理数据库.为了降低应用程序对物理数据源访问的次数,从而提高应用程序的运行性能,我们想到使用hibernate缓存机制. ...

  5. (11) Hibernate 缓存机制

    一.why(为什么要用Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数 ...

  6. 初识Hibernate 缓存

    生活就像一杯咖啡,让你我慢慢的品尝,品尝它的苦涩和甘甜...... 一.什么是Hibernate缓存. 解析:白话来说就是缓存数据的容器 官方标准点缓存:是计算机领域的概念,它介于应用程序和永久性数据 ...

  7. hazelcast 使用_使用HazelCast进行Hibernate缓存:JPA缓存基础知识

    hazelcast 使用 HazelCast的最大功能之一就是对Hibernate第二级缓存的支持 . JPA具有两个级别的缓存. 一级缓存在事务期间缓存对象的状态. 通过两次查询相同的对象,您必须获 ...

  8. Hibernate缓存级别教程

    开始使用Hibernate的人们常见的问题之一就是性能,如果您没有太多的Hibernate经验,您会发现应用程序变慢的速度. 如果启用sql跟踪,您将看到有多少查询被发送到数据库,而这些查询几乎不需要 ...

  9. hibernate缓存机制与N+1问题

    在项目中遇到的趣事 本文基于hibernate缓存机制与N+1问题展开思考, 先介绍何为N+1问题 再hibernate中用list()获得对象: 1 /** 2 * 此时会发出一条sql,将30个学 ...

  10. Hibernate缓存 - 第一级缓存

    Hibernate缓存 - 第一级缓存 欢迎使用Hibernate缓存 - 一级缓存示例教程.最近我们研究了Hibernate架构,hibernate映射以及如何使用HQL以面向对象的方式触发SQL查 ...

最新文章

  1. Java项目:网上选课系统(java+SSM+jsp+mysql+maven)
  2. Linux之tcpdump
  3. Python easy_install
  4. 前端学习(2217):react元素渲染之时钟
  5. Python 头像动漫化,快来生成女朋友的动漫头像
  6. 带注释源码php,php的注释方法
  7. Java DatagramPacket 中的坑
  8. hao123谢幕,那是80后青春的记忆
  9. 查阅我们JavaScript学习新指南
  10. 面向对象的数据库db4o: 安装并使用db4o
  11. 原创度检测工具-文章原创度在线检测免费
  12. DTMF信号检测分析(Matlab)
  13. MATLAB图形句柄
  14. C++11(及现代C++风格)和快速迭代式开发 -- 刘未鹏
  15. 180422 3步法Windows10引导Ubuntu开机启动
  16. imx6 android 最新,Re: IMX6D Android6.0 OTA 升级问题
  17. 关于美国安利的真实情况 !!!!!
  18. PS 2019 Mac版 自学入门系列(七)—— 调亮深色区域
  19. 基于jquery的轮播图组件开发-1
  20. 网页设计配色应用教程之各种色彩对比分析

热门文章

  1. 又在上海!这场人工智能大会,由图灵奖得主等带来机器学习、知识工程等干货分享!...
  2. 深度学习「CV」学习实践指南!
  3. DeepMind出品:终于不瞎编了!AI学会了“谷歌一下”,回答问题正确率达90%。
  4. 大写的服!中科大博士写20万字论文:如何给女朋友送礼物
  5. 清华「暗黑破坏神」夺超算世界冠军,暨南大学首次参赛就跻身前三 | ISC21
  6. 只要60页!牛逼不行的Python数据分析入门知识手册
  7. 【每日一算法】有效的括号
  8. 美多商城之购物车(购物车存储方案)
  9. 卷积神经网络(CNN)实现CIFAR100类别分类
  10. ValueError: not enough values to unpack (expected 3, got 0)问题