Mybatis二级缓存配置中readOnly属性的理解

mybatis实现读写分离 现网生产环境mysql基本上都会采用多主多从的集群模式,能够同时提高读和写的并发性能。那么在微服务中如何在不同的业务操作不同的库又同时对代码没有侵入性呢?在此给出两种常用的方式:1、spring aop的方式动态拦截切换数据源 2、采用mybatis-plus的方式,通过注解和配置的方式简单实现。无论哪一种方式在同一个被拦截的service层,不通过spring bean容器管理进行调用都无法有效切换数据源 阅读详情

readOnly属性:只读    (true/false)

true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此返回的这些缓存对象自己没事不要去修改。一旦修改,就会影响下一个相同查询条件的查询结果。这提供了很重要的性能优势。

false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这些对象可以随意修改,不会影响后续相同查询条件的结果。这会慢一些,但是安全,因此默认是false。

实验一、

        1.把readOnly设置为默认状态:false

        2.为了确保实验的准确性,我进行了三次查询。

                第一次,查询之后返回了数据库中的数据,映射为实例对象,我们这时候提交一下(提交之后缓存就不在一级缓存了,就被读写到了二级缓存)

                第二次,查询之后,返回缓存对象的拷贝,我们把返回的拷贝对象(List集合)清空。

                第三次,查询之后,返回缓存对象的拷贝,我们输出一下发现集合是空

@Test
    public void getEmpByConditionTest(){
        SqlSession session1 = SqlSessionUtils.getSqlSession();
        SqlSession session2 = SqlSessionUtils.getSqlSession();

        //第一次查询,无缓存,查询的数据库
        DynasicSQLMapper dynasicSQLMapper = session1.getMapper(DynasicSQLMapper.class);
        Emp emp = new Emp(null,"zhangsan",12,"男",null);
        final List<Emp> list = dynasicSQLMapper.getEmpByCondition(emp);
        System.out.println(list);
        System.out.println("=========================");
        //提交到二级缓存
        session1.commit();

        //第二次查询,在二级缓存
        DynasicSQLMapper dynasicSQLMapper2 = session2.getMapper(DynasicSQLMapper.class);
        List<Emp> list2 = dynasicSQLMapper.getEmpByCondition(emp);
        //清空返回的缓存对象
        list2.clear();
        System.out.println(list2);
        System.out.println("=========================");

        //第三次查询,在二级缓存中查询
        DynasicSQLMapper dynasicSQLMapper3 = session2.getMapper(DynasicSQLMapper.class);
        List<Emp> list3 = dynasicSQLMapper.getEmpByCondition(emp);
        System.out.println(list3);

    }

        3.从结果来看,第一次查询缓存中没找到,查的是数据库。第二次查询缓存的命中率为0.5,说明查到了缓存,第三次也一样,查到了缓存。

 

实验二、

        1.把readOnly设置为:true

        2.查询代码不变

        3.从结果来看,第一次查询,缓存命中率为0,说明缓存中没找到,查的是数据库。第二次查询缓存的命中率为0.5,说明查到了缓存,第三次也一样,查到了缓存。

总结:

        当readOnly为false时,修改返回的缓存对象(的拷贝),不会修改缓存中的数据。

        当readOnly为true时,修改返回的缓存对象(的相同实例),会修改缓存中的数据,影响下一次相同查询条件的查询结果。

YOLOv8剪枝实战:基于torch_pruning的模型优化与性能提升指南 本文详细介绍了如何使用torch_pruning工具对YOLOv8模型进行结构化剪枝,以实现模型轻量化与性能提升。通过实战步骤解析,包括环境搭建、依赖图分析、迭代剪枝与微调策略,帮助开发者有效减少模型参数量和计算量,提升在边缘设备上的推理速度,同时保持检测(detect)与分割(segment)任务的精度。 阅读详情

相关推荐

2026.3.13:docker compose运行了Milvus 6个月,占用磁盘近138GB的原因

Docker容器运行Milvus半年后占用138GB磁盘空间,主要原因是容器日志无限增长、容器内写入大量数据未挂载到数据卷,以及未清理临时文件。通过检查发现超大容器目录569035582ce3...占用主要空间。解决方案是使用truncate命令清空容器日志文件(*-json.log),释放磁盘空间。建议配置日志轮转机制,并将数据挂载到宿主机数据卷以避免类似问题。

拥抱具身智能,昇腾Ascend C 148

MyBatis框架缓存专题-源码解析(附源码讲义)

Mybatis缓存包含一个非常强大的产查询缓存特征,它可以非常方便地定制和配置缓存,缓存可以极大的提高查询效率。Mybatis系统中默认定义了两级缓存:一级缓存和二级缓存默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)二级缓存需要手动开启和配置,他也是基于namespace级别的缓存。为了提高扩展性,Mybatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存。 本课程为MyBatis缓存模块的源码分析课程,深入浅出讲解了MyBatis底层缓存模块的设计思想,帮助大家掌握MyBatis底层缓存模块的设计思想,任务企业开发和面试,提高编程内功!  

鼎捷易飞ERP9.0.8安装文件免费下载地址.rar

最新易飞9.0.8官方原版安装盘下地址

java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed

今天更新数据时出现这个错误: java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed 原因是:我在service层设置了只读。@Transactional(readOnly = true) 而更新的方法没有把可读设置为FALSE。解决办法是在方

你究竟是想一辈子卖糖水,还是希望获得改变世界的机会? 1万+

MyBatis 缓存机制

一级缓存(本地缓存) sqlsession级别的缓存,一级缓存是一直开启的,sqlsession几倍的一个与数据库同一次会话期间查询到的数据会放到本地缓存中 失效的情况 1.不同的sqlsession 2.同一个sqlsession,参数不同(当前缓存中没有这个数据) 3.sqlsession相同,两次查询期间执行了增删改操作(这次增删改可能对数据有影响) 4.sqlsession相同,手动清空了...

荼白 314

Springboot集成Mybatis二级缓存

什么是缓存? 简单来讲,缓存就是存储在缓冲区里的内容,或者可以理解为存在内存中的内容。用户可以将经常查询的内容放到缓存中,再次使用时直接从缓存中取值,而不需要再查询数据库。这样做的优点是响应迅速,减少了系统资源(网络资源、CPU资源等)开销;缺点是需要占用内存资源,服务器一旦关机,缓存就会丢失,重启后需要重新将写一遍数据到内存。 Mybatis的缓存 Mybatis的缓存分为一级缓存和二级缓存。一...

huanongying123的专栏 5456

MyBatis缓存专题-一文彻底搞懂MyBatis二级缓存

文章目录1.二级缓存概念2.二级缓存使用2.1.配置二级缓存2.2.分开关2.3.实体类实现序列化接口2.4.测试方法3.cache有一些可选的属性3.1.type3.2.eviction3.3.flushInterval3.4.size3.5 readOnly3.6 blocking4.MyBatis的缓存机制整体设计以及二级缓存的工作模式5.使用二级缓存,必须要具备的条件6.一级缓存和二级缓存的使用顺序7.二级缓存实现的选择 1.二级缓存概念 二级缓存是用来解决一级缓存不能跨会话共享的问题的,范围是na

专业的计算机毕业设计指南 7552

Mybatis 源码畅谈软件设计(八):从根上理解 Mybatis 二级缓存

二级缓存本质上是HashMap,在实现类中二级缓存是 Mapper 级别的,可以在不同SqlSession间共享特殊的 readOnly 标签,默认为 false,表示二级缓存中是被深拷贝的对象二级缓存需要在事务提交后才能生效执行 Insert、Delete、Update 语句会使当前 Mapper 下的二级缓存失效。

qq_35485206的博客 609

mybatis二级缓存配置

一、应用场景 对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。实现方法如下:通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔flushInterval,比如设置为30分钟、60分钟、24小时等,根据需求而定。 二、...

咻pur慢 3830

MyBatis Plus最全面的使用总结

基本使用 填坑 1、逻辑删除:当使用@TableLogic注解给实体类标注了逻辑删除字段后,如果想要删除数据的话一定要用baseMapper.deleteById(),而不是根据id查询出来一个实体对象,然后将逻辑删除字段标记为删除(默认11为删除),然后通过updateById()去更新这个字段,因为mabatis将该字段设置为逻辑删除后,update操作会忽略这个字段,默认将它设置为0。 ...

谢小鱼的博客 5833

MyBatis-Plus实现SQL执行前统一处理添加只读标识等注释

利用MyBatis-Plus官方提供的能力,在sql执行前拦截,然后拼接我们想添加的任何注释内容。

mojiewangday的博客 981

mybatis整合 SpringBoot(缓存机制)

有了mybatis公司给我们整合的工具类那么我们就不用像以前还得去配置数据源 我们在这里只需引入依赖即可: 我们首先先创建一个简单的数据库 create database springbootmapper; CREATE TABLE `user` ( `id` int(16) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(16) NOT...

坚持就是胜利的博客 2522

springBoot+myBatis配置基于mysql的读写分离

xxx

teamo_m的博客 468

MyBatis Plus

MP

weixin_44251806的博客 1978

事务管理@Transactional注解属性详解

事务管理 事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性; Spring 实现事务管理有如下两种方式: 1.编程式事务管理: 将事务管理代码嵌入到业务方法中来控制事务的提交和回滚,在编程式管理事务中,必须在每个事务操作中包含额外的事务管理代码。 2.声明式事务管理(推荐): 大多数情况下比编程式事务管理更好用,它将事务管理代码从业务方法中分离出来,以声明的方式来实现事务...

qq_41763734的博客 2709

MyBatisMyBatis 二级缓存全详解

上一篇文章中我们介绍到了 MyBatis 一级缓存其实就是 SqlSession 级别的缓存,什么是 SqlSession 级别的缓存呢?一级缓存的本质是什么呢?以及一级缓存失效的原因?我希望你在看下文之前能够回想起来这些内容。,那么如果多个 SqlSession 需要共享缓存,则需要开启二级缓存,开启二级缓存后,会使用 CachingExecutor 装饰 Executor,进入一级缓存的查询流程前,先在CachingExecutor 进行二级缓存的查询,具体的工作流程如下所示。

九师兄 1万+

设置readonly变成了false为什么还是不能编辑呢

<input type="text" :readonly="isreadonly" /> 我是这样写的通过一个变量来确定是是否添加readonly属性。 computed:{ isreadonly(){ return this.$route.query.from=='detail'?'true':'false'; } }, 但是在true的时候的确是变成了不可编辑的,但是false的时候...

肖肖肖丽珠的博客 4266
上一篇: 客户端Git安装教程
下一篇: mybatis-generator 的坑我都走了一遍
大飞机杰森
博客等级 码龄7年 58粉丝 87原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值