首页 > 其他分享 >mybatis缓存

mybatis缓存

时间:2024-05-11 16:53:47浏览次数:26  
标签:mapper 缓存 对象 数据库 二级缓存 SqlSession mybatis

  1. 缓存

    缓存(即cache)的作用是为了减去数据库的压力,提高数据库的性能。缓存实现的原理是从数据库中查询出来的对象在使用完后不销毁,而是存储在内存(缓存)中,当再次需要获取该对象时,直接从内存中获取,不再向数据库执行select语句,减少对数据库的查询次数,提高了数据库的性能。缓存是使用Map集合存储数据,mybatis默认两级缓存,一级缓存,和二级缓存。

  2. 一级缓存的作用域是同一个SqlSession,在同一个SqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库查询的数据写到缓存(内存),第二次会从缓存中获取数据而不进行数据库查询,大大提高了查询效率。当一个SqlSession结束后该SqlSession中的一级缓存也就不存在了。MyBtais默认开启一级缓存。

    MyBatis开启一个数据库会话时,会创建一个新的SqlSession对象,其中有一个新的Executor对象。Executor对象中持有一个新的PerpetualCache对象,当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象会一并释放掉。

  3. 缓存失效

    • 当SqlSession调用close()方法时,SqlSession对象关闭,直接会释放掉一级缓存PerpetualCache对象,一级缓存将不可用。
    • 如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是SQlSession对象还可以用。
    • SqlSession中执行了任何一个update(修改)、delete(删除)、insert(新增)操作,都会清空PerpetualCache对象中的数据,但是SqlSession对象仍然可用。
  4. 二级缓存(全局缓存)

    • 二级缓存的作用域是SqlSessionFactory级别,整个应用程序只有一个。二级缓存区域是根据mapper的namespace划分的,相同的namespace的mapper查询的数据缓存在同一个区域,如果使用mapper代理方法每一个mapper的namespace都不同,此时可以理解为二级缓存区域是根据mapper进行划分的。

    • 每次查询都会先从缓存区域查找,如果找不到则从数据库进行查询,并将查询到的数据写入缓存。MyBtais内部缓存使用HashMap,key为hashCode+sqlid+sql语句,value为从查询出来映射生成的java对象。SqlSession执行任何一个update(修改)、delete(删除)、insert(新增)操作commit提交后都会清空缓存区域,防止脏读。

    • 二级缓存默认是不开启的,需要进行相应的配置,在Mybatis-config.xml中配置setting, name="cacheEnabled" value="true"

    • POJO序列化,将所有的POJO类(bean)实现序列化接口java.io.Serializable。

    • 在Mapper.xml映射文件中添加cache标签,表示次mapper开启二级缓存,也有cache的相应配置。

  5. 不同缓存策略介绍

    • FIFO(First In First Out):这种策略是按照对象进入缓存的顺序来移除它们。最早进入的对象会最先被移除。
    • LRU(Least Recently Used):最近最少使用的对象会被首先移除。这种策略是基于对象被访问的次数和频率,适用于大部分缓存场景。
    • 软引用(Soft Reference):在这种策略下,对象会被封装在软引用中。当JVM内存不足时,这些对象可能会被垃圾回收器回收。
    • 弱引用(Weak Reference):类似于软引用,但生命周期更短。在JVM进行垃圾回收时,这些对象更有可能被回收。
  6. 处理业务时,先去看二级缓存中有没有,再看一级缓存中有没有,如果都没有再去查询数据库,MyBatis 的一级缓存 二级缓存都不建议使用,它们只适用于单体项目,现在基本都是分布式或者微服务 框架使用的话会存在数据不一致问题。

  7. mybatis自定义缓存:可以集成很多三方中间件来做缓存

    • 添加依赖:
    <dependency>
        <groupId>org.mybatis.caches</groupId>
        <artifactId>mybatis-redis</artifactId>
       <version>xxx</version>
    </dependency>
    
    • 配置开启缓存:mybatis-plus.configuration.cache-enabled=true
    • 在mapper.xml文件中添加:

标签:mapper,缓存,对象,数据库,二级缓存,SqlSession,mybatis
From: https://www.cnblogs.com/hytip/p/18186757

相关文章

  • 3-6缓存_文件压缩
    3.6缓存文件压缩永久缓存配置nginx提供proxy_store指令将提供资源的服务器的响应内容缓存到本地,适合缓存网站中几乎不变的内容server{  listen80;  server_name192.168.1.1;  location/{  rootcache;    缓存路径需要手动创建给权限/usr/......
  • 查看apk的缓存文件内容
    #进入超级管理用户adbshellsu#挂载system分区,可写一般情况/system分区是只读的,需要挂载为读写。mount-orw,remount/data#查找新增的缓存文件cd/data/data/com.fxb.learningtablet/cache/web_resource_cache/ls-la#apk应用操作完成后比对新增的文件 #修改文件属性chmo......
  • 故障分析 | TCP 缓存超负荷导致的 MySQL 连接中断
    1.背景在执行跑批任务的过程中,应用程序遇到了一个问题:部分任务的数据库连接会突然丢失,导致任务无法完成。从数据库的错误日志中,发现了 Abortedconnection 的信息,这说明客户端和服务器之间的通信被异常中断了。2.分析为了找出问题的原因,我们首先根据经验,分析了可能导致连接被......
  • SpringBoot整合Mybatis时mapper文件和xml文件的位置
    xml文件放在resources下看下我的项目目录2.由于放在resurces下就无法扫描到xml文件,所以就需要在配置文件配置--mapper文件位置mybatis.mapper-locations=classpath:mapper/*.xml或mybatis.mapper-locations=classpath:/mapper/*.xmlxml和mapper文件放在一起我的项目......
  • mybatisplus 中查询的实体对应的表名是动态的解决方案
    开发中遇到需要查询一些表里的数据,这些数据按照一定的规则存放在不同的数据库表里,例如表名是table_name+月份 table_name_2024_05,table_name_2024_04这样,这些表的结构都相同。网上找了一些动态修改实体对应数据库表名的方法,操作相对复杂而且跟mybatisplus的版本有关。自己......
  • mybatis核心配置文件
    在resource目录下,创建mybatis-config.xml(官方建议起名方式)核心配置文件常用元素properties:通过resource属性从外部指定属性文件(db.properties),该属性文件描述数据库连接的相关配置(数据库驱动、连接数据库的url、数据库用户名、数据库密码),位置也是在/resources目录下settin......
  • mybatis中的增删改操作
    在之前的操作之后,若要编写增删改操作,需要变动的只有UserMapper接口,UserMapper.xml以及测试类举例删除操作-delete://Dao层接口UserMapper增加deleteById方法:intdeleteById(intid);映射文件UserMapper.xml中增加与Dao层接口匹配的如下内容<!--删除操作--><deleteid="......
  • 第一个mybatis程序
    注意与之前JDBC的区别,简化在哪里准备工作数据库,表的创建:创建一个名为mybatis的数据库,在其中创建user表,字段为is,name,pwd项目的准备:新建一个普通的maven项目作为父项目,删除src目录,在pom文件中导入必要的依赖(mysql-connector-java,mybatis,junit),创建第一个子项目,选择父项目......
  • Mybatis基础知识
    什么是mybatis?mybatis是一款用于持久层的、轻量级的半自动化ORM框架,封装了所有jdbc操作以及设置查询参数和获取结果集的操作,支持自定义sql、存储过程和高级映射。框架用于持久层,就是说这个框架是和数据库进行交互的,用于数据库中数据操作的框架轻量级框架的概念可以简单的理......
  • .NET 缓存:内存缓存 IMemoryCache、分布式缓存 IDistributedCache(Redis)
    .NET缓存:内存缓存IMemoryCache、分布式缓存IDistributedCache(Redis)  .NET缓存里分了几类,主要学习内存缓存、分布式缓存一、内存缓存IMemoryCache1、Program注入缓存builder.Services.AddMemoryCache();2、相关方法及参数Get、TryGetValue、GetOrCreate、GetOrCrea......