如果出现了线上连接池爆满的情况,一般情况需要先“止损”,也就是重启服务。
现在一般都会用云上的服务,会有监控,对应监控能查到历史数据库的情况,包括连接池的占用情况、重启后我们快速分析定位事故反生之前一段时间 SOL的执行情况,连接池的占用情况。
查看当时是否有大量的突发清求,例如做了运营活动,那么很可能请求数上来会导致数据车压力过大,处理缓慢使得连接池占用久导致连接数满了。这种情况应该之前预先压测,并且通过限流等手段控制服务的整体压力,。
查看是否有慢 SOL导致长时间连接的占用,需要特别注意近期上线的功能,快速定位查找可能影响的功能点进行代码修复。
查看连接池配置是否合理,大部分默认的连接池的最大连接数可能就只有8或者 10,这种情况下需要适当提高最大连接数,具体连接数需要根据具体业务压测后配置
常见数据库查询性能优化
查看慢查询日志:分析数据库慢查询日志,查看是否有查询性能较差的SQL语句,导致连接长期占用。
优化查询:对于慢查询,可以优化 SOL、增加索引、减少全表扫描等,提升查询效率,减少数据库连接的占用时间。
数据库锁竞争:确认是否有长时间持有锁的 SOL查询,避免长时间的锁竞争导致连接池中的连接无法释放。
面对突发流量应对措施
- 限流:限制每秒请求的数量,避免瞬时流量过大导致连接池耗尽。
- 请求排队:通过消息队列等将请求异步化,减轻数据库直接访问的压力。可以将需要访问数据库的操作转到后台处理,而不是即时返回。(业务上需要做开关,开关打开后就异步处理,正常情况下同步处理)
- 服务降级:对于某些非核心功能,考虑返回默认值或缓存数据,避免直接查询数据库,减轻高峰期的压力