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

最终效果

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

相关推荐
麦聪聊数据28 分钟前
解构“逻辑数据仓库 (LDW)”与数据虚拟化
数据库·数据仓库·sql
Ahtacca1 小时前
Redis 五大常用数据类型详解及 Java 客户端(RedisTemplate)操作实战
java·数据库·redis·学习·缓存
小鸡脚来咯2 小时前
Hive SQL与SQL不同处
hive·hadoop·sql
DarkAthena4 小时前
【GaussDB】从 sqlplus 到 gsql:Shell 中执行 SQL 文件方案的迁移与改造
数据库·sql·oracle·gaussdb
C_心欲无痕4 小时前
nodejs - pnpm解决幽灵依赖
前端·缓存·npm·node.js
rchmin4 小时前
Redis集群扩容数据迁移方案分析
redis·缓存
最贪吃的虎4 小时前
Redis 除了缓存,还能干什么?
java·数据库·redis·后端·缓存
susu108301891116 小时前
使用navicat创建事件event报错You have an error in your SQL syntax
数据库·sql
oulaqiao16 小时前
幂等性——网络抖动重复支付的解决方法
sql·web app
独自破碎E18 小时前
Spring Boot工程启动以后,怎么将数据库中已有的固定内容打入到Redis缓存中?
数据库·spring boot·缓存