Mybatis----缓存

MyBatis是一个流行的Java持久化框架,它提供了一个灵活的缓存机制来提高查询性能。

MyBatis的缓存机制主要分为一级缓存和二级缓存。

一级缓存是指在同一个SqlSession中,查询结果会被缓存起来,当再次执行同样的查询时,直接从缓存中获取结果,而不需要再次发起数据库查询。一级缓存是MyBatis默认启用的,可以通过配置来禁用。

二级缓存是指多个SqlSession之间共享的缓存,它可以减少数据库的访问次数,提高性能。默认情况下,二级缓存是禁用的,需要手动配置开启。可以使用一些第三方插件(比如EhCache或Redis)来实现二级缓存。

要启用二级缓存,需要在MyBatis的配置文件中配置相应的缓存配置。在映射文件中,可以使用<cache>标签来配置二级缓存的相关属性,比如缓存类型、缓存过期时间等。

1.一级缓存

Mybatis默认开启一级缓存,当在同一个会话中多次查询同一个语句,Mybatis会自动使用一级缓存获取查询结果。

复制代码
@Test
public void test2() throws IOException {
    SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
    SqlSession sqlSession = sqlSessionFactory.openSession();
    AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);
    System.out.println("第一次查询:");
    System.out.println(mapper.selectAll());
    System.out.println("第二次查询");
    System.out.println(mapper.selectAll());
    sqlSession.close();

}

由此可见,第二此次查询是从一级缓存中拿到的结果。

修改语句,将查询语句之间插入一条删除语句

一级缓存会在删除时自动清除,不仅仅是删除,增加,更新也会使一级缓存清除。

不同的会话对象不会共享缓存

复制代码
@Test
public void test2() throws IOException {
    SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
    SqlSession sqlSession = sqlSessionFactory.openSession();
    SqlSession anthorSqlSession=sqlSessionFactory.openSession();
    AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);
    AccountMapper anthorMapper = anthorSqlSession.getMapper(AccountMapper.class);
    System.out.println("第一次查询:");
    System.out.println(mapper.selectAll());
    System.out.println("第二次查询");
    System.out.println(anthorMapper.selectAll());
    sqlSession.close();

}

一级缓存仅仅在同一会话中生效

2.二级缓存

Mybatis中一个SqlSessionFactory对应一个数据库,而二级缓存就是SqlSessionFactory级别的。

开启二级缓存需要一下步骤

1.全局的开启关闭映射文件中配置的缓存
复制代码
<settings>
    <setting name="cacheEnable" value="true"/>
</settings>

默认值就是true

2.在映射文件中配置<cache></cache>
3.映射文件映射的实体类必须为可序列化类

实现Serializable接口

4.会话必须提交或者是关闭,值才能写入二级缓存
测试
复制代码
public void test2() throws IOException {
    SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
    SqlSession sqlSession = sqlSessionFactory.openSession();
    SqlSession anthorSqlSession=sqlSessionFactory.openSession();
    AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);
    AccountMapper anthorMapper = anthorSqlSession.getMapper(AccountMapper.class);
    System.out.println("第一次查询:");
    System.out.println(mapper.selectAll());
    sqlSession.commit();
    System.out.println("第二次查询");
    System.out.println(anthorMapper.selectAll());
    sqlSession.close();

}

注意:当出现增加,删除,更新语句的时候,二级缓存通用会被清除

二级缓存的驱逐策略

MyBatis的二级缓存提供了多种驱逐策略(Eviction Strategy)来管理缓存中的对象,确保缓存不会无限增长并占用过多的内存。以下是一些常见的驱逐策略:

  1. LRU(Least Recently Used):最近最少使用策略会驱逐最近最少被使用的对象。当缓存达到设定的大小上限时,将会移除最近最少被使用的对象。
  2. FIFO(First In, First Out):先进先出策略会按照对象最先进入缓存的顺序进行驱逐。当缓存达到设定的大小上限时,最先进入缓存的对象将会被移除。
  3. Soft References:软引用策略使用Java的软引用机制,当内存不足时,垃圾回收器会根据软引用对象的使用情况来回收内存。这样可以让缓存中的对象在内存不足时被回收,避免内存溢出。
  4. Time To Live(TTL):时间驱逐策略允许为缓存中的对象设置一个存活时间,在存活时间到期后,缓存中的对象将被驱逐。

例如:

复制代码
<cache eviction="FIFO"></cache>

总结一下,MyBatis的缓存机制包括一级缓存和二级缓存,一级缓存默认启用且无需配置,一级缓存是SqlSession级别的缓存;二级缓存需要手动配置启用,可以减少数据库的访问次数,提高性能,是多个SqlSession共享的缓存。

相关推荐
郑州光合科技余经理8 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
2601_962071578 小时前
类变量和全局变量的生命周期有什么区别?
java·开发语言·jvm
code2cat8 小时前
Java进阶篇之AtomicReference:一次替换引用,读到一份完整状态
java·并发编程·不可变对象·atomicreference
专业程序开发源9 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
Wang's Blog9 小时前
Java 项目实战: 外卖平台优化-前后端分离开发模式与工程拆分
java·开发语言
hweiyu009 小时前
Redis命令:HTTL
redis·缓存
HEJOO910 小时前
指针的算术运算详解
java·数据结构·算法
sunshine22 girl10 小时前
Java学习六 Java常见API-2--String-3-字符串的截取替换和其他方法
java·开发语言·学习
EatFan10 小时前
从“框架混战“到“运行时收敛“:2026 年 AI Agent 开发框架的三条路线之争
java·数据库·人工智能·多智能体·ai agent·mcp·agent 框架
小蒜学长10 小时前
基于SpringBoot的佳新超市管理系统设计与实现系统(代码+数据库+LW)
java·数据库·spring boot·后端·佳新超市管理系统