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

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存活了一个小时,那么将整个清空一下。

mybatis的一二级缓存 MyBatis 给我们提供了一级缓存二级缓存机制来提高查询效率和减少数据库交互次数,一级缓存主要用于单次数据库会话内的查询优化,而二级缓存则着眼于整个应用层面的数据复用。 阅读详情

相关推荐

mybatis一级缓存二级缓存

一、什么是缓存 缓存是存在于内存中的临时数据。 使用缓存减少和数据库的交互次数,提高执行效率。 1、适用于缓存 经常查询并且不经常改变的; 数据的正确与否对最终结果影响不大的; 2、不适用于缓存 经常改变的数据; 数据的正确与否对最终结果影响很大的; 例如:商品的库存,银行的汇率,股市的牌价; 二、mybatis一级缓存 1、一级缓存简介 一级缓存作用域是sqlsession级别的,同一个sqlsession中执行相同的sql查询(相同的sql和参数),第一次会去查询数据库并写到缓存中,第

学Java,找哪吒 7万+

MyBatis二级缓存讲解

1、二级缓存的定义 二级缓存也称作是应用级缓存,与一级缓存不同的是它的作用范围是整个应用,而且可以跨线程使用。所以二级缓存有更高的命中率,适合缓存一些修改比较少的数据。 2、二级缓存扩展性需求 二级缓存的生命周期是整个应用,所以必须限制二级缓存的容量,在这里mybatis使用的是溢出淘汰机制。而一级缓存是会话级的生命周期非常短暂是没有必要实现这些功能的。相比较之下,二级缓存机制更加完善。 3、二级缓存的结构 二级缓存在结构设计上采用装饰器+责任链模式 1)二级缓存是如何组装这些装饰器的呢? 这里我们先介

chi_666的博客 1907

MyBatis一级缓存二级缓存

碰见了不懂,学学接着还是提问首先,什么是缓存

流楚丶格念的博客 1899

Mybatis:一级缓存二级缓存

一级缓存二级缓存

qq_43300204的博客 1525

Mybatis缓存过期机制和RedisCache

MyBatis缓存过期机制, flushInterval参数 在实际测试中, 发现Redis中的缓存数据TTL为-1, 在Hash中的key也无过期时间信息, 怀疑RedisCache的实现是否能正常处理缓存过期, 因此一路追查到了MyBatis的代码. MyBatis在每个Mapper中, 可以设置参数flushInterval 用来控制缓存过期时间, 这个参数, 在 MapperBui...

IOsetting的专栏 956

Mybatis的工作流程、生命周期和缓存机制

mybatis理论性东西进行归纳总结

weixin_43462126的博客 2243

mybatis 二级缓存失效_mybatis一级缓存二级缓存过期时间分析

对于mybatis缓存,我们往往有这样两个疑问:一级缓存二级缓存过期时间是多少?后台是否有个线程在检测?针对这两个问题,见下面的分析:1、一级缓存过期时间,只有生命周期(1)MyBatis在开启一个数据库会话时,会创建一个新的SqlSession对象,SqlSession对象中会有一个Executor对象,Executor对象中持有一个PerpetualCache对象,见下面代码。当会话结...

weixin_34754795的博客 1438

应用系统缓存体系深入研究(Java版)

一、序言 在使用MyBatisMybatisPlus等DAO层数据库访问框架式,常常会与一级缓存二级缓存打交道,为了增强对缓存体系的整体把控力,提高软件应用响应速度,这里对三级缓存一次梳理。 缓存固然能够提高系统性能,与此同时也带来了脏数据的副作用,系统的缓存体系、缓存结构、缓存策略、缓存介质等对可能出现的脏数据产生影响。 缓存是一把双刃剑,既能够提高应用系统的效率,同时避免脏数据发生也是不小的工作量。特别是不同的层次的缓存同时使用时,出现数据异常的概率快速提高。 二、一级缓存MyBatis技术为

V539413949的博客 133

mybatis一级缓存二级缓存使用详解

针对mybatis一级缓存二级缓存使用进行详细说明,搞清楚mybatis缓存的生命周期。

弹指天下 6949

MyBatis缓存实战指南:一级二级缓存的深度解析与性能优化

在电商大促期间,我们的用户查询接口QPS从500骤增至5000,数据库连接池频频告警。当我将MyBatis二级缓存应用在用户基础信息模块后,数据库负载直接下降70%——这就是缓存的力量。

DD2187718660的博客 2732

MYBATIS一级缓存二级缓存

MYBATIS一级缓存二级缓存

oyhy168的博客 1031

Mybatis缓存一级缓存二级缓存缓存穿透、缓存击穿、缓存雪崩区别和解决方案

一级缓存   Mybatis缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况...

qq_42191775的博客 2563

mybatis一级缓存二级缓存,netty实战pdf

一级缓存作用域是sqlsession级别的,同一个sqlsession中执行相同的sql查询(相同的sql和参数),第一次会去查询数据库并写到缓存中,第二次从一级缓存中取。一级缓存是基于 PerpetualCache 的 HashMap 本地缓存,默认打开一级缓存。它指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存

2401_83974064的博客 737

11. MyBatis一级缓存二级缓存有什么区别?如何配置和使用二级缓存

MyBatis 中,缓存机制用于减少数据库访问次数,提高应用程序性能。MyBatis 提供了两级缓存一级缓存二级缓存。1. 一级缓存(Local Cache):一级缓存作用于SqlSession级别。即在同一个SqlSession中执行相同的 SQL 查询,如果查询参数相同,MyBatis 会从缓存中直接返回结果,而不会再次查询数据库。:一级缓存是默认开启的,并且无法关闭。:一级缓存的生命周期与SqlSession的生命周期一致。当SqlSession关闭后,一级缓存也随之被清空。:在。

zhzjn的博客 1418
上一篇: Mysql优化
下一篇: Mybatis初始化原理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值