Hibernate学习笔记(三) — Hibernate 的一级缓存意义
什么是缓存?
缓存说白了,就是应用程序向数据库要数据,然后把一些数据,临时的放在了内存的区域中,第二次再要数据的时候,直接从内存中拿即可。
缓存需要解决的事情:
1.能把数据放入缓存 2.能把数据从缓存中取出来 3.如果缓存中的数据发生变化,需要把数据同步到数据库中
4.把数据库中的数据同步到缓存中 5.hits命中率低的对象应该及时从缓存中移走
分布式缓存:
为什么会有分布式缓存?
应用程序运行在服务器上,并发访问时,服务器压力过大,分布式缓存就是来分担服务器压力的。
分布式缓存之间的数据是同步的。(比如购物车中的数据都是存在session中)一旦某个服务器挂了,那么操作的数据在其他的服务器的缓存中还可以继续取出来。所以在Tomcat集群的时候,session是先存在了分布式缓存中,在 tomcat 内部集成了memory cache的分布式缓存,就能自动的把 session 同步。
面试,集群时解决 session 问题:就是利用分布式缓存来处理,tomcat可以与memory cache无缝的集成,在tomcat中配置即可。程序员不需要任何干涉。
比较流行的缓存
小型应用:oscache,ehcache
分布式:memory cache,redis,hbase
一、Hibernate的一级缓存
Hibernate的一级缓存,也称为 session 级别的缓存,其生命周期与 session 的生命周期保持一致
一级缓存的位置
持久化状态的对象,就是进入了一级缓存中,换句话说,如果一个对象是一个持久化对象,那么这个对象一定在一级缓存中。
二、Session的操作:
session.get():可以把对象放入到一级缓存中,也可以从一级缓存中把对象提取出来(第一次调用放,以后取)
session.save():可以把一个对象放入到一级缓存中
session.evit():可以把一个对象从缓存中清空
session.update():可以把一个对象放入到一级缓存中
session.clear():清空一级缓存中所有的数据
session.close():一级缓存的生命周期结束
测试:
private Session session;private Transaction transaction;@Beforepublic void init(){session = HibernateUtils.openSession();transaction = session.beginTransaction();}@Testpublic void testGet(){User user = (User) session.get(User.class, 1);//发sql,把对象放入到一级缓存中User user2 = (User) session.get(User.class, 1);//从一级缓存中直接取,不发sql//hibernate提供一个统计机制。获取缓存中实体的个数int count = session.getStatistics().getEntityCount();System.out.println(count);//1,所以get方法把对象放入到缓存transaction.commit();session.close();}@Testpublic void testSave(){User user = new User();user.setAge(250);user.setName("heh");session.save(user);int count = session.getStatistics().getEntityCount();System.out.println(count);//1,所以save方法把对象放入到缓存transaction.commit();session.close();}@Testpublic void testEvict(){User user = (User) session.get(User.class, 1);session.evict(user);int count = session.getStatistics().getEntityCount();System.out.println(count);//0,evit方法把get放入到缓存中的对象,清空了transaction.commit();session.close();}@Testpublic void testUpdate(){User user = (User) session.get(User.class, 1);session.evict(user);/*** 此处注意,evict方法之后,执行update会发送sql,即使对象不做任何修改* 此处,可以加深session.flush(),进行的对照副本的操作的理解* 注释掉evict,就不会发送update语句*/session.update(user);int count = session.getStatistics().getEntityCount();System.out.println(count);//1,update方法把对象放入到缓存transaction.commit();session.close();}@Testpublic void testClear(){User user = (User) session.get(User.class, 1);session.clear();int count = session.getStatistics().getEntityCount();System.out.println(count);//0,清空所有transaction.commit();session.close();}
三、一级缓存的真正意义:
从数据库中取出一个班级的所有学生信息,对学生信息进行修改,所有改的操作,都只是针对一级缓存中的数据,只有在 session 的 flush 后,才会与数据库交互。所以不论改多少人的信息,都只是 session.flush之后才会与数据库交互一次。这样就可以提供效率。
而不是get一次,发送一次sql语句,再次get就不发送sql语句,取数据get一次就行,get两次干吗?
一级缓存的内存结构:
源码:
内存结构图:
Hibernate学习笔记(三) — Hibernate 的一级缓存意义相关推荐
- hibernate学习笔记(总结)
hibernate学习笔记 课程内容 6 1 HelloWorld 6 2 Hibernate原理模拟-什么是O/R Mapping以及为什么要有O/R Mapping 6 3 常见的0/R框架(了解 ...
- 马士兵Hibernate学习笔记
马士兵hibernate学习笔记 课程内容 6课程内容 1 HelloWorld 6 2 Hibernate原理模拟-什么是O/R Mapping以及为什么要有O/R Mapping 6 3 常见的0 ...
- Hibernate学习笔记Session.evict(user)方法
@[TOC]Hibernate学习笔记Session.evict(user)方法 Hibernate学习笔记Session.evict(user)方法 首先我们要明白Session.flush(use ...
- Hibernate学习笔记(一)----针对不同的数据库不同的配置
Hibernate初学笔记 l Hibernate初步配置: 1 新建项目 2 学习建立user-library-hibernate,并加入相应的jar包(hibernate核心jar包,lib下的所 ...
- hibernate学习笔记二
上一篇关于hibernate学习笔记一,主要是作为hibernate的入门知识.没有和spring发生任何关系,这一篇我将把spring集成进去,看spring如何管理hibernate,还有和未使用 ...
- Spring框架学习笔记(三)(AOP,事务管理)
Spring框架学习笔记(三) 九.AOP 9.1 AOP的注解配置 (1) 新建计算器核心功能(模拟:不能在改动核心代码) (2) 建立一个普通的Java类写增强代码(面向切面编程),使用Sprin ...
- python3常用模块_Python学习笔记三(常用模块)
Python 学习笔记三 (常用模块) 1.os模块 os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果. os.name:返回当前操作系统名称( ...
- SurfaceFlinger学习笔记(三)之SurfaceFlinger进程
概述 本系列是基于android Q 即android10 SurfaceFlinger学习笔记(一)应用启动流程 SurfaceFlinger学习笔记(二)之Surface SurfaceFling ...
- 数组存储与指针学习笔记(三)指针与数组
嵌入式C语言学习进阶系列文章 GUN C编译器拓展语法学习笔记(一)GNU C特殊语法部分详解 GUN C编译器拓展语法学习笔记(二)属性声明 GUN C编译器拓展语法学习笔记(三)内联函数.内建函数 ...
- J2EE学习笔记三:EJB基础概念和知识 收藏
J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...
最新文章
- C#-析构方法与构造方法 087
- 配置Goldengate支持DDL
- 信安教程第二版-第10章入侵检测技术原理与应用
- 华为前端工程师分享:查明网站访问故障原因,教你4招快速应对
- rocketmq 4.X 扩容思路
- SQL卸载重装实例名重复问题
- session与cookie之间的关系
- 信息系统运行维护服务方案(IT运维服务方案)
- 电商系统架构全链路解析
- 360浏览器访问跨域问题
- js 实现继承的几种方式
- Unity AudioMixer效果器设置
- iMazing2.14.6Mac最新版iOS苹果设备管理器
- iOS 支付宝授权登录,思路
- 家里两个路由器,Wifi名相同密码相同,请问手机会自动选择信号强的路由器连接吗?
- 编程编辑器推荐(编程常用编辑器的横向对比)
- SpringBoot+Vue+mybatis生成pdf文件(表头跟页码,适应上传linux服务器后的操作)
- 梅姨眼中最爱读英国书籍的人竟然是TA?
- js 数组元素交换位置
- 华为鸿蒙系统界面亮相,比Android操作更简单。