【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包,重启即可

最终效果

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

相关推荐
小lu飞2 小时前
DeepSeek Flash 降价的技术账本:缓存友好型定价如何改写推理成本结构
缓存
子非鱼a4 小时前
【WEB】[GXYCTF2019]BabySQli
sql
hweiyu005 小时前
Redis命令:APPEND
redis·缓存
敲代码的嘎仔5 小时前
从集群锁失效到异步领券:我用分布式锁 + Redisson + MQ 把领券接口 RT 从 200ms 压到 15ms
java·数据库·redis·分布式·缓存·ai·wpf
MetaLite8 小时前
Spring Cache只留注解-MetaLite如何二开缓存运行时
java·spring·缓存
wdfk_prog9 小时前
lely-canopen-rtt:为什么推荐在 RT-Thread 上使用 Lely CANopen 构建主站
java·运维·缓存·docker·容器
莫得感情 o10 小时前
Redis 12 · 缓存一致性:数据库与缓存双写怎么不乱
redis·缓存
todoitbo10 小时前
SQL Server数据库迁移:V9R4C019 如何接住存量 T-SQL 批处理
数据库·sql·国产数据库
写后端的胖头鱼10 小时前
【高频面试题】SQL 查询慢怎么排查
数据库·sql·mysql·oracle·慢查询·高频面试题
小程序设计11 小时前
基于SQL与漏斗模型的社群App优化研究
数据库·sql