【Mycat1.6】缓存不生效问题处理

背景

系统做读写分离,有大量读需求,基本没有实时获取数据业务需要,所以可以启用缓存来减缓数据库压力,传统使用mybatis的缓存需要大量侵入式声明,所以结合需求使用Mycat中间件来满足

数据库结构

  • mysql-master:主库,含数据表test.table1
  • mysql-slave:从库,含数据表test.table1
  • mycat:开启一写两读,默认使用ehcache缓存

问题流程

  • 部署最新的Mycat1.6后,navicat进入8066,执行两次 select * from table1;
  • navicat进入9066控制台,执行show@@cache命令,发现hit一直为0

问题解决

  • 修改mycat的log级别为debug,查看日志中的SQLRouteCache

  • 定位到EnchachePool第77行中

    2023-09-06 11:00:09,221 [DEBUG][$_NIOREACTOR-5-RW] SQLRouteCache miss cache ,key:testselect * from table1 (io.mycat.cache.impl.EnchachePool:EnchachePool.java:77)

  • 下载源码并调试(过程略),发现查询语句并没有写入到缓存中,具体位置RouteService:

  • 问题出在rrs参数cacheAble默认为false,调试过程中没发现该参数有变化(估计是分库分表增加路由id后才会启动,暂不展开)

  • 根据我的需求,构造函数中默认改为true,即可解决问题

  • 重新打包jar包,替换线上/lib下的同名jar包,重启即可

最终效果

重新执行一遍操作,发现已经命中缓存,大功告成

相关推荐
java1234_小锋7 小时前
Java高频面试题:Redis里什么是缓存击穿、缓存穿透、缓存雪崩?
java·redis·缓存
y = xⁿ7 小时前
【从零开始学习Redis|第四篇】从底层理解缓存问题:雪崩、击穿、穿透与一致性设计
java·redis·学习·缓存
代码探秘者8 小时前
【Redis】分布式锁深度解析:实现、可重入、主从一致性与强一致方案
java·数据库·redis·分布式·缓存·面试
所谓伊人,在水一方3339 小时前
【Python数据科学实战之路】第12章 | 无监督学习算法实战:聚类与降维的奥秘
python·sql·学习·算法·信息可视化·聚类
霖霖总总10 小时前
[Redis小技巧7]Redis Bitmaps 深度解析:从原理到用户签到实战
数据库·redis·缓存
xcLeigh11 小时前
Oracle 替换工程实践深度解析:金仓数据库破解 PL/SQL 兼容与跨交易日数据一致性核心难题
数据库·sql·oracle·数据迁移·金仓·kingbasees
Brucye12 小时前
[极客大挑战 2019]BabySQL 1
sql·网络安全
彭于晏Yan12 小时前
Redis缓存更新策略
spring boot·redis·spring·缓存
y = xⁿ12 小时前
【从零开始学习Redis|第五篇】Redis 常见数据类型和应用场景
数据库·redis·学习·缓存
憧憬成为web高手12 小时前
sql-lab 19
sql