缓存的介绍

一:什么是缓存?

缓存(cache),数据交换的缓冲区,当应用程序需要读取数据时,先从数据库中将数据取出,放置在 缓冲区中,应用程序从缓冲区读取数据。

缓存的特点:

数据存放在内存中,可以快速访问并使用

缓存的缺点:

数据无法得到更新

缓存有两种说法,即命中和未命中。

命中指的是在缓存中找到了需要的数据,而未命中指的是没有找到需要的数据,未命中则需要到数据库中继续寻找。

缓存的作用:

减少 Java Application 与数 据库的交互次数,从而提升程 序的运行效率;

适合使用缓存:

经常查询并且不经常改变的

数据的正确与否对最终结果影响不大的

比如:一个公司的介绍,新闻等

不是适用于缓存:

经常改变的数据

数据的正确与否对最终结果影响很大

比如商品的库存,股市的牌价等

二:立即加载和延迟加载

立即加载

即不管信息有没有用,只要调用,拿上发起查询并加载信息

例如:当我们查询学生信息时,就需要知道学生在哪个班级,所以就要立即查询班级信息

通常当一对一 或 多对一 的时候需要立即加载

延迟加载

当真正使用数据的时候才发起查询,不用的时候不查询,按需加载(也叫懒加载)

例如: 在查询班级信息,每个班级都会有很多的学生(假如每个班有100个学生),如果我们只是查看 班级信息,但是学生对象也会加载到内存中,会造成浪费。 所以我门需要进行懒加载,当确实需要查看班级中的学生信息,我门在进行加载班级中的学生信息。

通常:一对多 或 多对多 的时候需要延迟加载

配置方式

立即加载时默认的,所以要配置懒加载就需要修改一下

三:一级缓存

什么是一级缓存:

一级缓存是默认开启的,只能对同一个SqlSession对象而言

Student stu1 = sm.findStudentBysid(1);
Student stu2 = sm.findStudentBysid(1);
System.out.println(stu1 == stu2);
//结果为true
Student stu1 = sm.findStudentBysid(1);
sqlSession.clearCache();
Student stu2 = sm.findStudentBysid(1);
System.out.println(stu1 == stu2);
DBUtil.sqlSessionClose(sqlSession)
//结果为false

因为这里的sqlSession被关掉了一次,又重新建立的sqlSession和之前的不是同一个,缓存被删掉重新建立了一个,所以“ == ”的结果是false。

注意:当调用sqlsession的修改,添加,删除,commit(),close() 等方法是, 就会清空一级缓存

一级缓存的配置

localCacheScope:表示配置一级缓存

SESSION 默认是session级别的缓存

STATEMENT statement级别的缓存

一级缓存失效的情况:

不同的SqlSession对应不同的一级缓存

同一个SqlSession单查询条件不同

同一个SqlSession两次查询期间执行了任何一次增删改操作

同一个SqlSession两次查询期间手动进行了清空缓存

四:二级缓存

二级缓存说明

在同一个sql工厂下的都是二级缓存,但是注意工厂在项目之处成立,并在项目结束时结束,所以项目运行中是无法关闭和更新数据的

配置步骤

第一种:

第二种(注释方式):

1、在mybatis的SqlMapConfig.xml中配置

2、在接口的定义上面直接使用@CacheNamespace并将blocking设置为true

二级缓存的特点

Mybatis 的二级缓存相对于一级缓存来说, 实现了缓存数据的共享,可控性也更强;

极大可能会出现错误数据,有设计上的缺陷,安全使用的条件比较苛刻;

分布式环境下,必然会出现读取到错误数据,所以不推荐使用。

相关推荐

  1. 介绍一下浏览器缓存(Expires, Cache-Control等)

    2024-01-20 22:56:02       44 阅读
  2. linux Socket 缓存 介绍

    2024-01-20 22:56:02       52 阅读
  3. http缓存协议详细介绍

    2024-01-20 22:56:02       59 阅读
  4. SpringBoot缓存注解@Cacheable使用姿势介绍

    2024-01-20 22:56:02       66 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-20 22:56:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-20 22:56:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-20 22:56:02       87 阅读
  4. Python语言-面向对象

    2024-01-20 22:56:02       96 阅读

热门阅读

  1. Python装饰器

    2024-01-20 22:56:02       70 阅读
  2. SQL中的几个区别

    2024-01-20 22:56:02       50 阅读
  3. Python爬虫实战014:利用requests库实现自动评论

    2024-01-20 22:56:02       59 阅读
  4. stm32 - GPIO高级用法

    2024-01-20 22:56:02       67 阅读
  5. Oracle学习笔记——基础一起学 16

    2024-01-20 22:56:02       53 阅读
  6. python元类模型和class语句协议

    2024-01-20 22:56:02       67 阅读
  7. leetcode-路径总和

    2024-01-20 22:56:02       70 阅读
  8. C语言零基础入门(结构体)

    2024-01-20 22:56:02       54 阅读