数据库连接耗尽了之后的反省

数据库技术
557
0
0
2022-06-11

突然一天,服务器频繁报警,一个内部管理系统连接数据库超时,导致系统无法访问。

我马上展开调查,日志显示【Cannot get a connection, pool error Timeout waiting for idle object】。这明显是数据库连接不够了。马上查看rds的连接数情况。发现另一个任务系统占用了大部分连接。暂时紧急处理,杀掉了一些无用的连接。内部管理系统暂时得到了恢复。

松了口气,喝了点脉动,去了个厕所。马上就开始了全方面调查和改进。

1)首先我调查了所有系统的连接池的设定情况(最小连接数和最大连接数)。(全部大大小小的系统共十几个,共用一个数据库)。看看加起来的数据库连接数是否接近数据库最大连接数。根据每个系统的访问量,合理设置连接数。

2)其次调查一下任务系统为什么会占用大量的数据库连接。原来有个定时任务10分钟一次,但是由于加了服务调用处理,导致整个任务无法在10分钟之内完成,之后引发了同时有多个定时任务在并发执行,占用了大量的数据库连接。改进方案:任务完成后才会启动下一次任务,防止同一任务并发执行。(具体方法很多,大家自己想哦)

3)设置数据库的wait_timeout的大小。不看不知道,居然设置的是86400s,那怪会有那么多的无用连接了。马上改成了1000s。

(wait_timeout:参数含义:服务器关闭“非交互连接”之前等待活动的秒数。)

还好不是外部系统出问题,不然老板该请技术部喝茶了

数据库连接耗尽了之后的反省