2023-02-22 23:35:11
针对数据库连接池到DRDS连接探活的优化,核心在于调整探活SQL语句并优化连接池参数配置,以降低0号库压力并提升系统整体性能。
探活SQL优化DRDS将无表名的SQL(如SELECT 'x')和SHOW命令默认下发至0号库,而实际业务SQL可能被分发至其他分库。
客户端探活SQL检测的是“客户端→DRDS→0号库”的链路,而非客户端与DRDS的直接连接状态,导致检测逻辑失效。

效果验证:修改后0号库的探活SQL执行记录消失,压力下降约80%。
问题根源应用侧配置testOnBorrow=true时,每次获取连接均触发探活SQL,导致DRDS实例整体压力升高。
推荐配置以Druid连接池为例,调整以下参数以平衡性能与可用性:
testWhileIdle=true:仅对空闲连接(闲置时间≥minEvictableIdleTimeMillis)进行探活检测,失败则移除连接。
timeBetweenEvictionRunsMillis=60000:Destroy线程每60秒检测空闲连接。
minEvictableIdleTimeMillis=60000:定义连接闲置1分钟为“空闲连接”。
配置逻辑
减少高峰期探活频率:通过testWhileIdle替代testOnBorrow,避免每次获取连接时执行检测。
快速响应连接异常:缩短minEvictableIdleTimeMillis(如30秒),可更快发现网络闪断等问题,但需权衡性能开销。
0号库压力显著降低:探活SQL不再下发至0号库,其CPU、IO等指标下降约80%。
图6:优化前后0号库压力对比系统性能与可用性平衡:通过调整空闲连接检测间隔和阈值,减少无效探活对DRDS实例的冲击,同时降低业务因连接问题出错的概率。
修改探活SQL为SELECT 'x' FROM dual,避免下发至0号库。
调整连接池参数(如testWhileIdle、minEvictableIdleTimeMillis),减少高峰期探活频率。