前言:这些天学习效率比较慢,可能是手头的事情比较多,所以学习进度比较慢。

在之前的Hibernate学习中,我们无论是CURD,对单表查询还是检索优化,我们好像都离不开session,session我们之间也简单的说过,它是一个缓存,这一篇文章就就Hibernate的缓存进行一些介绍,我们将从以下几点进行:

  • 缓存的分类
  • 一级缓存
  • 快照
  • 二级缓存
  • EHCache配置
  • 二级缓存内容配置
  • 总结

一丶缓存的分类:
Hibernate中缓存分为一级缓存和二级缓存,像我们之前经常用到的session是一级缓存,二级缓存Hibernate并没有内置,但是它提供了支持和规范,我们可以通过一些第三方插件来使用这些二级缓存,使用之前当然要进行配置。

二丶一级缓存:
①一级缓存就是session缓存,其实就是内存中的一块空间,在这个内存空间中存放了相互关联的java对象。

②session缓存是事务级缓存,随着事务 的开启而开启,随着事务的关闭而关闭,session缓存由Hibernate进行管理。

③当我们使用session的load() get() save()等方法的时候Hibernate会对相关的实体对象进行缓存。

④session的刷新与同步,session的刷新是指session缓存中的数据更新,session同步是指将session中的数据同步到数据库中,执行同步的时间只有一个,即事务的提交,但是session的刷新可以有几个,主要有一下三个刷新点:
(1)执行Query查询
(2)执行session.flush()
(3)执行事务的提交

三丶快照
什么是快照?
快照就是副本,Hibernate中的快照就是数据库的副本,快照中的数据是由Hibernate自己维护。快照中的数据由Hibernate自己维护,快照中的数据保持和数据库是一致,代码不能对它进行修改,其作用主要是为了在处理数据的更新时,将session中的数据和快照进行比对,(即和数据库中的数据进行比对)以此来判断是否执行update语句。

当代码通过session的查询方法调用,将数据加载到内存中后,Hibernate会将此数据存放于session缓存中,当然快照中也有该数据的副本。默认情况下,在事务提交的时候会比对session和快照中的数据,如果不同,则数据发生了更新,会将session中缓存的数据用update进行更新,如果相同,说明数据未发生改变,无需做出同步。

四丶二级缓存:
二级缓存是SessionFactory级的缓存,其生命周期和SessionFactory一致,SessionFactory缓存可以依据功能和目的的不同划分为内置缓存和外置缓存。

SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句。SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义语句,因此SessionFactory不需要进行内置缓存与映射文件的同步。

SessionFactory的外置缓存是一个可配置的插件。在默认情况下,SessionFactory不会启用这个插件。外置缓存的数据是数据库的副本,外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓存也被称为Hibernate的二级缓存。

Hibernate本身只提供了二级缓存的规范,但是并为实现,故需要第三方缓存产品的支持。
常用的二级缓存第三方插件有:EHCache,Memcached,OSCache,SwrmCache,JBossCache等。这里我们就不一一介绍。

二级缓存的内容分为:

  • 类缓存
    缓存我们查询的实体类(详情)
  • 集合缓存
    缓存的是集合中所包含对象的id
  • 查询缓存
    缓存的是查询语句对应的结果

本篇文章就EHCache来进行配置和说明。

五丶EHCache的配置:
①在使用这个二级缓存之前我们需要导包(黄色涂鸦部分是我们要的包):

②导包过后我们需要在Hibernate的主配置文件中开启二级缓存:

在这个路径中properties文件中可以找到我们需要的属性。

③开启过二级缓存后需要需要为这个二级缓存开辟一片缓存空间,同样我们需要在主配置文件中配置开辟一片缓存空间:

④最后我们还需要一个二级缓存配置文件

这个配置文件在这个jar包最底部,名字叫:ehcache-failsafe.xml,我们将它改为ehcache.xml,并发到项目根目录下:

这样我们的二级缓存的环境就配置好了。

六丶缓存内容的配置:
上面我们提及到了缓存的内容,接下来我们就来看看二级缓存的内容是如何配置的:
首先需要在主配置文件中指定类缓存和集合缓存:
①类缓存的配置
我们需要在映射文件中指定的类中添加如下图的配置:

②集合缓存的配置
在指定集合内进行配置

③查询缓存的配置
在主配置文件中配置Query缓存

七丶总结
Hibernate提供的两级缓存机制,在信息量访问较大的情况下,能够通过避免相同的查询,减少访问数据库的次数,来缓解服务器的压力。这样的机制大大提高了系统的整体访问效率,同时也降低了对服务器硬件的要求,要学会根据业务的需要来使用Hibernate的缓存机制,不要盲目使用。

Hibernate学习---缓存机制的更多相关文章

  1. Hibernate笔记——缓存机制详细分析

    原文:http://www.cnblogs.com/xiaoluo501395377/p/3377604.html ========================================== ...

  2. java框架篇---hibernate之缓存机制

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

  3. Spring控制Hibernate的缓存机制ehcache

    首先在spring.xml中进入bean <prop key="hibernate.cache.use_second_level_cache">true</pro ...

  4. 【Hibernate 7】浅谈Hibernate的缓存机制

    一.Hibernate缓存机制简介 对于Hibernate本身来说,它的缓存主要包括三部分:session缓存(一级缓存).二级缓存.查询缓存. 1.1,session缓存 随着session的关闭而 ...

  5. hibernate 及缓存机制

    hibernate 是一个持久层的框架,经常访问物理数据库,为了降低应用程序访问物理数据库的频次, 从而提升性能, hibernate缓存机制分为: 一类是session 级缓存,二是sessionF ...

  6. hibernate 的缓存机制

    这是面试中经常问到的一个问题,楼主可以按照我的思路回答,准你回答得很完美,首先说下Hibernate缓存的作用(即为什么要用缓存机制),然后再具体说说Hibernate中缓存的分类情况,最后可以举个具 ...

  7. hibernate笔记--缓存机制之 二级缓存(sessionFactory)和查询缓存

    二级缓存(sessionFactory): Hibernate的二级缓存由SessionFactory对象管理,是应用级别的缓存.它可以缓存整个应用的持久化对象,所以又称为“SessionFactor ...

  8. Hibernate 所有缓存机制详解

    hibernate提供的一级缓存 hibernate是一个线程对应一个session,一个线程可以看成一个用户.也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和 ...

  9. Hibernate所有缓存机制详解

    hibernate提供的一级缓存 hibernate是一个线程对应一个session,一个线程可以看成一个用户.也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和 ...

随机推荐

  1. TFS中如何排除Nuget的Packages文件夹

    在项目的解决方案下新增.tfignore文件.文件内容如下: \packages 在项目的解决方案下新增.nuget文件夹,并新增Nuget.config文件,文件内容如下: <?xml ver ...

  2. Java并发编程(十二)线程安全性的委托

    在组合对象中如果每个组件都已经是线程安全的,是否需要再加一个额外的"线程安全层",需要视情况而定. final可以修饰未复制的属性,只要在静态代码块或者构造函数中赋值了即可. 独立 ...

  3. finsh初步

    一. finsh在RT-Thread中被设计成一个独立的线程,它试图从外部设备中获得用户的输入,然后对用户命令进行解析执行. 正确使用finsh需要一个关联过程: rt_hw_board_init() ...

  4. PHP测试与优化(1)-- Apache自带的压力测试工具ab(apache bench) - 简单使用

    ab是apache自带的网站压力测试工具,能够测试网站在一定时间内的发生高并发时的反应. 使用 1.进入apache的bin文件夹 2.模拟并发级别为100,请求数为1000个的api数据请求数量测试 ...

  5. java中JSONObject与JSONArray的使用

    JSONObject与JSONArray 最近在学习过程中用到了稍微复杂点的json数据需要将json数据解析出来,这里就截取一部分作为例子 1.JSONObject介绍 JSONObject-lib ...

  6. Spring帖子汇总

    SpringMVC表单标签简介 http://haohaoxuexi.iteye.com/blog/1807330 Spring MVC 教程,快速入门,深入分析 http://elf8848.ite ...

  7. 我的第六个java程序 spring-bean

    配置文件 Beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&quo ...

  8. js金钱分割,正则

    ``` var test1 = '1234567890'var format = test1.replace(/\B(?=(\d{3})+(?!\d))/g, ',')"1,234,567, ...

  9. Java中将时间戳转化为Date类型

    时间戳timestamp,从前端接收到后.他能够是一个long或者包装类Long再或者是个String类型.仅仅需 new Date(时间戳) 就能够直接转化为java.util.Date类型. 转化 ...

  10. dedecms代码详解 很全面

    dedecms代码研究(1)开篇dedecms 相信大家一定都知道这个cms 系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统.而模板系统也是其他 ...