什么是缓存?

缓存说白了,就是应用程序向数据库要数据,然后把一些数据,临时的放在了内存的区域中,第二次再要数据的时候,直接从内存中拿即可。

缓存需要解决的事情:

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 的一级缓存意义相关推荐

  1. hibernate学习笔记(总结)

    hibernate学习笔记 课程内容 6 1 HelloWorld 6 2 Hibernate原理模拟-什么是O/R Mapping以及为什么要有O/R Mapping 6 3 常见的0/R框架(了解 ...

  2. 马士兵Hibernate学习笔记

    马士兵hibernate学习笔记 课程内容 6课程内容 1 HelloWorld 6 2 Hibernate原理模拟-什么是O/R Mapping以及为什么要有O/R Mapping 6 3 常见的0 ...

  3. Hibernate学习笔记Session.evict(user)方法

    @[TOC]Hibernate学习笔记Session.evict(user)方法 Hibernate学习笔记Session.evict(user)方法 首先我们要明白Session.flush(use ...

  4. Hibernate学习笔记(一)----针对不同的数据库不同的配置

    Hibernate初学笔记 l Hibernate初步配置: 1 新建项目 2 学习建立user-library-hibernate,并加入相应的jar包(hibernate核心jar包,lib下的所 ...

  5. hibernate学习笔记二

    上一篇关于hibernate学习笔记一,主要是作为hibernate的入门知识.没有和spring发生任何关系,这一篇我将把spring集成进去,看spring如何管理hibernate,还有和未使用 ...

  6. Spring框架学习笔记(三)(AOP,事务管理)

    Spring框架学习笔记(三) 九.AOP 9.1 AOP的注解配置 (1) 新建计算器核心功能(模拟:不能在改动核心代码) (2) 建立一个普通的Java类写增强代码(面向切面编程),使用Sprin ...

  7. python3常用模块_Python学习笔记三(常用模块)

    Python 学习笔记三 (常用模块) 1.os模块 os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果. os.name:返回当前操作系统名称( ...

  8. SurfaceFlinger学习笔记(三)之SurfaceFlinger进程

    概述 本系列是基于android Q 即android10 SurfaceFlinger学习笔记(一)应用启动流程 SurfaceFlinger学习笔记(二)之Surface SurfaceFling ...

  9. 数组存储与指针学习笔记(三)指针与数组

    嵌入式C语言学习进阶系列文章 GUN C编译器拓展语法学习笔记(一)GNU C特殊语法部分详解 GUN C编译器拓展语法学习笔记(二)属性声明 GUN C编译器拓展语法学习笔记(三)内联函数.内建函数 ...

  10. J2EE学习笔记三:EJB基础概念和知识 收藏

    J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...

最新文章

  1. C#-析构方法与构造方法 087
  2. 配置Goldengate支持DDL
  3. 信安教程第二版-第10章入侵检测技术原理与应用
  4. 华为前端工程师分享:查明网站访问故障原因,教你4招快速应对
  5. rocketmq 4.X 扩容思路
  6. SQL卸载重装实例名重复问题
  7. session与cookie之间的关系
  8. 信息系统运行维护服务方案(IT运维服务方案)
  9. 电商系统架构全链路解析
  10. 360浏览器访问跨域问题
  11. js 实现继承的几种方式
  12. Unity AudioMixer效果器设置
  13. iMazing2.14.6Mac最新版iOS苹果设备管理器
  14. iOS 支付宝授权登录,思路
  15. 家里两个路由器,Wifi名相同密码相同,请问手机会自动选择信号强的路由器连接吗?
  16. 编程编辑器推荐(编程常用编辑器的横向对比)
  17. SpringBoot+Vue+mybatis生成pdf文件(表头跟页码,适应上传linux服务器后的操作)
  18. 梅姨眼中最爱读英国书籍的人竟然是TA?
  19. js 数组元素交换位置
  20. 华为鸿蒙系统界面亮相,比Android操作更简单。

热门文章

  1. Vue+ElementUI 限制结束时间不能大于开始时间
  2. 数据可视化|用散点图进行数据分析
  3. (全过程)如何制作论坛网站,怎样免费制作论坛,制作论坛教程
  4. 高德地图 地图点击获取经纬度,经纬度格式判断
  5. js定义入参_js函数传参类型
  6. 一键删除PPT页面内的动画or页面的切换效果总结
  7. NetSuite Saved Search不是啥都能查
  8. MFC列表控件report报表可编辑操作
  9. 【OpenCV】检测人脸、眼睛、鼻子、耳朵、嘴
  10. 建筑CAD基础设计【2】