缓存:

  就是将数据保存到内存中,需要使用时直接从内存中获取,不需要每次查询数据库或者磁盘中的文件

hibernate的缓存

  • 一级缓存:Session级别的缓存
  • 二级缓存:SessionFactory级别的缓存

一级缓存

简介

hibernate的一级缓存指的就是Session缓存,Session缓存是一块内存空间,用来存放相互管理的Java对象。在使用hibernate查询对象的时候,首先会使用对象属性的OID值在hibernate的一级缓存中查询,如果能匹配到该OID值的对象,直接将对象从一级缓存中取出来,不需要再查询数据库;如果找不到匹配该OID值的对象,就查询数据库获取对象,并放入一级缓存中

hibernate一级缓存的主要作用就是减少数据库访问次数,是hibernate的一种重要优化手段

一级缓存是由Session内的一系列Java集合组成的

一级缓存的生命周期和Session一致,Session被创建时一级缓存开启,Session被销毁时一级缓存也被销毁

一级缓存是hibernate自带的,不可卸载的;只要使用hibernate,就会有一级缓存

        @Test
public void get(){
Session session = SessionFactoryUtil.getSession();
Transaction ts = session.beginTransaction(); //连续查询两次id为1的数据,看控制台输出查询sql的次数
User user1 = session.get(User.class, 1);
User user2 = session.get(User.class, 1); System.out.println("两次查询的是否为同一对象:"+ (user1 == user2)); ts.commit();
session.close();
}

  console输出

Hibernate:
select
user0_.id as id1_0_0_,
user0_.name as name2_0_0_,
user0_.password as password3_0_0_
from
user user0_
where
user0_.id=?
两次查询的是否为同一对象:true

  两次查询只输出一次查询sql,说明第二次查询使用的是session缓存中的对象数据

结构

session缓存的主要实现在于actionQueue和persistenceContext这两个属性

  • actionQueue:队列
  • persistenceContext:一组map集合

Session缓存中存在一块特殊区域:快照区。快照区的作用是用于保证数据的一致性

@Test
public void test(){
Session session = SessionFactoryUtil.getSession();
Transaction ts = session.beginTransaction(); //代码1
User user = session.get(User.class, 1);
//代码2
user.setName("qf");
//代码3
ts.commit(); session.close();
}

  

执行完代码1:

执行完代码2:

执行代码3

  比较缓存区和快照区数据,一致就不更新数据库;不一致就更新数据库

特点

1. 调用Session的close()方法时,一级缓存会被清空

2. 程序执行Session接口中的save()、update()、saveOrUpdate()方法时,如果Session缓存中没有相应的对象,就会自动把从数据库中查到的对象信息加入到Session缓存中

@Test
public void test(){
Session session = SessionFactoryUtil.getSession();
Transaction ts = session.beginTransaction(); //保存新用户
User user = new User("admin", "123");
Serializable id = session.save(user);
//根据保存返回的用户id查询用户信息
User user2 = session.get(User.class, id); System.out.println(user2); ts.commit();
session.close();
} 

console输出信息

Hibernate:
insert
into
user
(name, password)
values
(?, ?)
User [id=8, name=admin, password=123]

结果:

  输出信息中,只有插入数据的sql,并没有查询数据的sql,说明save保存对象后把对象数据放入session缓存中了,并且查询数据使用的是session缓存中的user对象

3. 程序执行Session接口中的get()、load()方法,或者Query接口的list()、iterator()方法时,会判断缓存中是否有该对象,有就直接返回,没有就查询数据库并添加缓存

@Test
public void test(){
Session session = SessionFactoryUtil.getSession();
Transaction ts = session.beginTransaction(); session.get(User.class, 1); session.get(User.class, 1); ts.commit();
session.close();
}  

console输出信息

Hibernate:
select
user0_.id as id1_0_0_,
user0_.name as name2_0_0_,
user0_.password as password3_0_0_
from
user user0_
where
user0_.id=?

结果:

  只发送一次查询sql,说明第一次查询后将对象放入缓存中了,第二此查询直接从缓存中获取对象数据

二级缓存

hibernate并没有提供相应的二级缓存的组件,所以需要加入额外的二级缓存包,常用的二级缓存包是EHcache

在hibernate.cfg.xml配置文件中配置我们二级缓存的一些属性

<!-- 开启二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 二级缓存的提供类 在hibernate4.0版本以后我们都是配置这个属性来指定二级缓存的提供类-->
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<!-- 二级缓存配置文件的位置 -->
<property name="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</property>

配置hibernate的二级缓存是通过使用 ehcache的缓存包,所以我们需要创建一个 ehcache.xml 的配置文件,来配置我们的缓存信息,将其放到项目根目录下

开启二级缓存:在映射文件中配置<cache usage="read-only"/>

二级缓存是sessionFactory级别的缓存,在配置了二级缓存以后,当session关闭以后,再去查询对象的时候hibernate首先会去二级缓存中查询是否有该对象,有就不会再发sql了

四、hibernate的缓存的更多相关文章

  1. Hibernate之缓存的原理

    一.关于缓存: 其实对于缓存而言,它其实就是一块内存空间,在这个空间中存放了相互关联的持久化对象, 也就是存在于Session缓存内的对象,那么Session负责根据持久化对象的状态变化来同步的更新数 ...

  2. Hibernate ——二级缓存

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

  3. Hibernate的缓存技术详解

    转载注明出处:http://www.cnblogs.com/xiaoming0601/p/5882980.html 一.什么是缓存: 并不是指计算机的内存或者CPU的一二级缓存:缓存是指为了降低应用程 ...

  4. 记录Hibernate的缓存知识

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

  5. 初学hibernate之缓存

    一.1.Session级别缓存属于一级缓存,持久化对象保存在Session一级缓存中(一级缓存引用持久化对象地址),只要session不关闭,一级缓存就存在,缓存中对象也不会被回收: Session会 ...

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

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

  7. Hibernate(十六):Hibernate二级缓存

    Hibernate缓存 缓存(Cache):计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如磁盘上的文件或者数据库)之间,起作用是降低应用程序直接读取永久性数据存储源的频率,从而提高应用 ...

  8. Hibernate一级缓存和二级缓存详解

    (1)一级缓存 是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个session(一定要同一个session)又做了同一个操作,那么h ...

  9. hibernate一级缓存和二级缓存的区别

    http://blog.csdn.net/defonds/article/details/2308972 缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了 ...

随机推荐

  1. 解决“每次打开office2010的word都会出现配置进度框”问题

       在win7中安装完office2010后.打开 *.doc文件时,总会弹出"配置进度框"问题,解决例如以下:  1)点击"開始"-->"执 ...

  2. mysql修改root密码和设置权限 转摘:http://www.cnblogs.com/wangs/p/3346767.html

    整理了以下四种在MySQL中修改root密码的方法,可能对大家有所帮助! 方法1: 用SET PASSWORD命令 mysql -u root mysql> SET PASSWORD FOR ' ...

  3. Python3学习笔记——自定义模块

    import sys import os print(__file__) #打印相对路径 base_dir = os.path.dirname(os.path.dirname(os.path.absp ...

  4. PHP字符串操作函数练习20191025

    <?php$arr=["tom","peter","mary"];$str=implode("+",$arr);/ ...

  5. 【Flutter学习】之DateTime日期转换

    概述: 表示一个时间点 通过构造函数或解析格式化的字符串创建DateTime对象,并且符合ISO 8601标准的子集,小时是24小时制,范围在0-23之间 DateTime对象创建之后,将是固定不变的 ...

  6. 21.Semaphore信号量

    Semaphore是一种基于计数的信号量.它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞.Semaphore可以用来构建一些对象池,资 ...

  7. Quartz.Net 任务调度之传递参数(2)

    1.jobDetail //添加 //Key:Value jobDetail.JobDataMap.Add("张翼德", "张翼德"); jobDetail.J ...

  8. sql server教程

    简单认识 SQL Server sql server教程 SQL Server 是 Microsoft 开发的一个关系数据库管理系统(RDBMS),现在是世界上最为常用的数据库: SQL Server ...

  9. Cisco基础(四):配置标准ACL、配置扩展ACL、配置标准命名ACL、配置扩展命名ACL

    一.配置标准ACL 目标: 络调通后,保证网络是通畅的.同时也很可能出现未经授权的非法访问.企业网络既要解决连连通的问题,还要解决网络安全的问题. 配置标准ACL实现拒绝PC1(IP地址为192.16 ...

  10. element-ui 复选框,实现点击表格当前行选中或取消

    背景: 1.表格结构绑定事件 <el-table v-loading="StepsListLoading" :data="StepsListData" b ...