Mybatis的一级缓存,二级缓存过期时间分析

简介: Mybatis的一级缓存,二级缓存过期时间分析

Mybatis的缓存级别

Mybatis提供了查询缓存来查询数据,使在项目开发中提高性能。 Mybatis的缓存分为一级缓存和二级缓存,一级缓存是SqlSession级别的缓存,二级缓存是mapper级别的缓存,二级缓存是多个

SqlSession共享的。Mybatis通过缓存机制减轻数据压力,提高数据库的性能。

一.一级缓存没有过期时间,只有生命周期

(1).Mybatis在开启一个数据库会话时,会创建一个新的SqlSession对象。SqlSession对象的缓存是Mybatis的一级缓存,在操作数据库时需要创建SqlSession对象,在对象中有hashMap用于保存缓存数据(对象的id作为key,而对象作为 value保存的)。一级缓存的作用范围是SqlSession范围的,当一个SqlSession中执行两次相同的sql第一次执行完就会将数据库查询到的数据写进缓存,第二次查询时直接去缓存中查找,从而提高数据库的效率。

(2)如果SqlSession执行DML(insert,update,delete)操作,并且提交到数据库,Mybatis会清空SqlSession的一级缓存,这样做的目的是为了保存最新的数据,避免出现脏读的现象。当Mybatis会清空SqlSession的一级缓存(生命周期结束)

(3)SqlSession对象中会有一个Executor对象,Executor对象中持有一个PerpetualCache对象,见下面代码。当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。

protected BaseExecutor(Configuration configuration, Transaction transaction) {
this.transaction = transaction;
this.deferredLoads = new ConcurrentLinkedQueue<DeferredLoad>();
this.localCache = new PerpetualCache("LocalCache");
this.localOutputParameterCache = new PerpetualCache("LocalOutputParameterCache");
this.closed = false;
this.configuration = configuration;
this.wrapper = this;
}

a.如果SqlSession调用了close()方法,会释放掉以及缓存PerpetualCache,一级缓存将不可用;

b.如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用;

c.SqlSession中执行了任何一个更新操作,例如:update、delete、insert ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用;


二.二级缓存有过期时间,但是没有后台线程检测

(1)二级缓存是mapper级别的缓存,使用二级缓存时,多个SqlSession使用同一个mapper的sql语句去操作数据库,得到的数据存在二级缓存区域。同样是使用hashMap进行存储。

(2)相比于一级缓存,二级缓存的范围更大,多个SqlSession可以共用二级缓存,二级缓存时跨SqlSession的。

(3)二级缓存是多个SqlSession共享的,其作用域是SqlSession的namespace。Mybatis一级缓存是默认开启的,二级缓存没有默认开启,需要在setting全局配置中配置开启二级缓存。


二级缓存有过期时间,并不是key-value的过期时间,而是这个cache的过期时间,是flushInterval,意味着整个清空缓存cache,所以不需要后台线程去定时检测。

public class ScheduledCache implements Cache
{
    private final Cache delegate;
    protected long clearInterval;
    protected long lastClear;
    public ScheduledCache(Cache delegate)
    {
        this.delegate = delegate;
        this.clearInterval = 60 * 60 * 1000;
        this.lastClear = System.currentTimeMillis();
    }
    public void setClearInterval(long clearInterval)
    {
        this.clearInterval = clearInterval;

每当存取数据的时候,都有检测一下cache的生命时间,默认是1小时,如果这个cache存活了一个小时,那么将整个清空一下。

相关文章
|
2月前
|
存储 XML 缓存
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南(一)
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南
78 0
|
6天前
|
Java 关系型数据库 数据库连接
MyBatis 执行流程分析
MyBatis 执行流程分析
11 2
|
18天前
|
缓存 Java 数据库连接
MyBatis三级缓存实战:高级缓存策略的实现与应用
MyBatis三级缓存实战:高级缓存策略的实现与应用
35 0
MyBatis三级缓存实战:高级缓存策略的实现与应用
|
18天前
|
XML 缓存 Java
MyBatis二级缓存解密:深入探究缓存机制与应用场景
MyBatis二级缓存解密:深入探究缓存机制与应用场景
55 2
MyBatis二级缓存解密:深入探究缓存机制与应用场景
|
18天前
|
存储 缓存 Java
探秘MyBatis缓存原理:Cache接口与实现类源码分析
探秘MyBatis缓存原理:Cache接口与实现类源码分析
35 2
探秘MyBatis缓存原理:Cache接口与实现类源码分析
|
2月前
|
缓存 应用服务中间件 数据库
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
37 1
|
2月前
|
存储 缓存 Java
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制
|
2月前
|
缓存 Java 数据库连接
mybatis 数据库缓存的原理
MyBatis 是一个流行的 Java 持久层框架,它封装了 JDBC,使数据库交互变得更简单、直观。MyBatis 支持两级缓存:一级缓存(Local Cache)和二级缓存(Global Cache),通过这两级缓存可以有效地减少数据库的访问次数,提高应用性能。
282 1
|
2月前
|
存储 缓存 Java
【MyBaits】4、延迟加载、MyBatis 的缓存
【MyBaits】4、延迟加载、MyBatis 的缓存
22 0