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

最终效果

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

相关推荐
2501_9336707917 小时前
2027届大数据管理与应用求职数字化转型顾问:项目、SQL、业务理解怎么排优先级
数据库·sql
ShineWinsu18 小时前
对于Redis:Hash类型的解析
c++·redis·分布式·缓存·面试·hash·哈希表
.Hypocritical.18 小时前
Redis从入门到实战:核心原理、场景落地与避坑指南
数据库·redis·缓存
资深技术分享员19 小时前
Geejing WebBuilder 数据库连接配置与在线 SQL 工具,运维的左右手
运维·数据库·sql·低代码
做运维的阿瑞20 小时前
一个 NULL 让整列姓名消失?MySQL 字符串与日期函数复盘
数据库·sql·mysql
程序猿乐锅20 小时前
【黑马点评 | 第十一篇】关注 Feed 流实现
java·数据库·redis·分布式·后端·缓存·maven
Eloudy21 小时前
NVLink GPU-to-GPU:本地GPU L2 是否缓存远端 GPU 数据
缓存
阳光九叶草LXGZXJ21 小时前
达梦数据库-学习-69-DM9主备集群部署
linux·运维·服务器·数据库·sql·学习
ShineWinsu21 小时前
对于Redis:List类型的解析
数据库·c++·redis·链表·缓存·面试·list
在猴站学算法21 小时前
(SQL注入学习)联合查询注入(UNION-Based)
sql·学习·网络安全