mybatis之缓存

一、简介

什么是缓存?

  • 存在内存中的临时数据

为什么使用缓存?

  • 减少交互次数,减少系统开销,提高系统效率

什么样的数据能使用缓存?

  • 经常查询但不经常修改的数据
    我们再次查询数据的时候,直接走缓存,就可以不要走数据库

MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。

①、一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。

②、二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。

二、一级缓存

一级缓存也叫本地缓存,是默认开着的

测试步骤:

  1. 开启日志
  2. 测试在一次session中查询两次相同的记录
  3. 查看日志输出
 @Test
    public  void  getUserByIdTest(){
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        User user = mapper.getUserById(1);
        System.out.println(user);

        System.out.println("-===========================-");

        User user2 =mapper.getUserById(1);
        System.out.println(user2);

        System.out.println(user==user2);
    }

运行结果如下:
运行结果

默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。

基本上就是这样。这个简单语句的效果如下:

映射语句文件中的所有 select 语句的结果将会被缓存。
映射语句文件中的**所有 insert、update 和 delete 语句**会刷新缓存。
缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
缓存**不会定时进行刷新**(也就是说,没有刷新间隔)。
缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。


缓存失效的情况:
1.增删改操作会改变原来的数据,所以会刷新缓存
![增删改操作刷新缓存](https://img-blog.csdnimg.cn/20201209154011814.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ4NjA4NTk4,size_16,color_FFFFFF,t_70#pic_center)

2.查询不同的Mapper.xml
3.查询不同的东西
4.手动清理缓存

```java
sqlSession.clearCache();

一级缓存默认是开启的,只在一次sqlsession中有效,也就是拿到连接到关闭连接这个区间有效

三、二级缓存

  • 二级缓存也叫全局缓存,一级缓存的作用域太低,所以就有了二级缓存

  • 基于namespace的缓存,一个名称空间对应一个二级缓存

  • 二级缓存开启后,一级缓存关闭时,二级缓存开始生效,一级缓存的数据也会保存到二级缓存

要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:

<cache/>

缓存只作用于 cache 标签所在的映射文件中的语句。如果你混合使用 Java API 和 XML 映射文件,在共用接口中的语句将不会被默认缓存。你需要使用 @CacheNamespaceRef 注解指定缓存作用域。

这些属性可以通过 cache 元素的属性来修改。比如:

<cache
  eviction="FIFO"
  flushInterval="60000"
  size="512"
  readOnly="true"/>

这个更高级的配置创建了一个 FIFO 缓存,每隔 60 秒刷新,最多可以存储结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此对它们进行修改可能会在不同线程中的调用者产生冲突。

可用的清除策略有:

LRU – 最近最少使用:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
默认的清除策略是 LRU。

开启步骤:
1.开启全局缓存

 <settings>
        <setting name="cacheEnables" value="true"/>
    </settings>

2.在Mapper.xml 文件中开启缓存

<!-- 开启二级缓存 -->
<cache></cache>

三、自定义缓存ehcache

  • Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。

使用:

1.导包

 <dependency>
      <groupId>org.mybatis.caches</groupId>
      <artifactId>mybatis-ehcache</artifactId>
      <version>1.1.0</version>
    </dependency>

2.Mapper映射文件配置

cache type="org.mybatis.caches.ehcache"></cache>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值