业务背景
在使用Spring Cloud Alibaba搭建的微服务架构中,项目采用ShardingSphere进行分库分表,MyBatis-Plus作为持久层。线上环境突发大量预编译语句过多
的数据库告警,导致系统性能下降。
排查过程
1. 初步排查:联系云数据库厂商
首先,联系云数据库服务厂商协助排查,确认问题是由于预编译缓存未被释放,导致占用过多数据库资源。
2. 排查连接池配置
怀疑问题与连接池有关,特别是考虑到线上负载较高的高峰时段。经过检查,项目使用的是HikariCP连接池,相关配置如下:
特别关注两个参数:
maxLifetime
: 连接池最大生命周期idleTimeout
: 连接池空闲超时时间
在进行断点调试后,由于项目使用了Sharding-JDBC,某些参数并未按照Hikari的默认值生效,而是被Sharding进行初始化配置。Sharding的相关代码如下:
此时可以初步排除连接池配置问题,因为Sharding已将idleTimeout
配置为60秒。
3. 分析HikariCP源码与Statement Cache问题
深入分析Hi