背景
系统做读写分离,有大量读需求,基本没有实时获取数据业务需要,所以可以启用缓存来减缓数据库压力,传统使用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包,重启即可
最终效果
重新执行一遍操作,发现已经命中缓存,大功告成