欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

mybatis缓存机制

发布时间:2025/5/22 编程问答 35 豆豆
生活随笔 收集整理的这篇文章主要介绍了 mybatis缓存机制 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

  • 缓存介绍
  • 一级缓存
    • 二级缓存
      • 二级缓存使用步骤
    • 二级缓存和一级缓存的区别:

缓存介绍

缓存主要是对查询起作用,减轻数据库的压力,提高数据库的性能
mybatis中提供了一级缓存、二级缓存

一级缓存是SQLSession级别的缓存,同一个SQLSession上的查询可以使用一级缓存,不同的SQLSession缓存是相互独立的,互不影响

二级缓存是mapper级别的缓存,多个SQLSession会命中二级缓存,及二级缓存可以在多个SQLSession之间共享

一级缓存

一级缓存是SQLSession级别缓存,一级缓存的作用域是一个SQLSession,在同一个sqlsession下两次执行相同的SQL查询操作,第一次执行完毕后会将数据库中查询的数据写入缓存,第二次会从缓存中获取数据则不从数据库中获取,提高查询效率,当SQLSession结束,缓存也就随之失效
mybatis是默认开启一级缓存


注意:缓存起作用是对同一个数据而言,必须是连续的查询操作,第一次操作之后缓存会起作用,在第一次查询之后对同一个数据做变更/删除操作,缓存会被清空,后续查询中的第一个查询是需要到数据库查询

一级缓存测试:

mybatis默认支持的,不需要配置

同一个session下连续查询操作:

二级缓存

mybatis的二级缓存是mapper级别的缓存,默认是关闭的
对同一个mapper其不同的SQLSession可以共享二级缓存,不同的mapper是相互独立的

二级缓存的使用需要打开二级缓存配置,映射的java对象实现序列化

二级缓存使用步骤

1、在mybatis的全局配置文件中打开二级缓存的开关

<settings><!--二级缓存的配置信息--><setting name="cacheEnabled " value="true"/></settings>

2、将映射的对象实现序列化

public class Student implements Serializable

3、在mapper中使用cache标签

<!--cache标签flushInterval(刷新时间) 是正整数,单位是毫秒,默认不设置,即没有刷新时间size(引用数据) 正整数,默认1024,记录是缓存的对象的数目readOnly(只读) eviction:给定缓存回收策略LRU:最近最少使用的,移除长时间不使用缓存对象FIFO:先进先出,按照对象进入缓存的顺序来移除对象soft:软引用:移除基于垃圾回收状态和软引用规则的对象weak:弱引用:移除弱引用所作用的对象--><cache flushInterval="60000" size="512" readOnly="true" eviction="LRU"/>

二级缓存的测试:

useCache:配置禁用缓存
在Statement上设置useCache="false"禁用select查询的二级缓存,即每次查询都会去数据库,不使用二级缓存

二级缓存和一级缓存的区别:

二级缓存的范围更大,多个SQLSession可以共享一个mapper中的二级缓存,
每一个mapper都有一个二级缓存,如果mapper的namespace如果相同,这两个mapper执行查询SQL查询到的数据将存在相同的二级缓存区域中

一级缓存,二级缓存 SQLSession->defaultSqlSession ->CachingExecutor
一级缓存:LocalCache
二级缓存:tcm
执行优先级源码

public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {Cache cache = ms.getCache();if (cache != null) {//是否为二级缓存this.flushCacheIfRequired(ms);if (ms.isUseCache() && resultHandler == null) {this.ensureNoOutParams(ms, parameterObject, boundSql);List<E> list = (List)this.tcm.getObject(cache, key);if (list == null) {list = this.delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);this.tcm.putObject(cache, key, list);}return list;}}return this.delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);}

总结

以上是生活随笔为你收集整理的mybatis缓存机制的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。