Skip to content

Latest commit

 

History

History
55 lines (15 loc) · 2.38 KB

137.md

File metadata and controls

55 lines (15 loc) · 2.38 KB

137、说说高并发场景下的数据库连接池应该如何进行优化?

以druid来举例

(1)maxWait

表示从池里获取连接的等待时间,万一你暂时没有可用的连接,就可能要等待别的连接用完释放,你再去使用,通常建议设置在1000以上,就是等待1s以上,比如你可以设置1200,因为有的时候要等待建立新的TCP连接,最多在1s内,那你就得等一会儿

如果这个参数默认设置为0,意思就是无限的等待获取连接,在高并发场景下,可能瞬间连接池耗尽,大量的请求都卡死在这里等待获取连接,进而导致你tomcat里没有可用的线程,服务就是一个假死的样子

你还会拖累调用你的其他服务,其他服务都卡死在调用你的请求上,可能会导致整体系统大量服务的雪崩

你设置一个靠谱点的参数,那么起码大量线程获取不到连接,1s左右快速就失败了,这个时候还不至于说拖死整个服务,也不至于说拖死其他调用你的服务,还不至于会发生服务雪崩的问题

(2)connectionProperties

里面可以放connectionTimeout和socketTimeout,分别代表建立TCP连接的超时时间,以及发送请求后等待响应的超时时间,推荐connectionTimeout设置为1200,socketTimeout设置为3000

之所以必须设置他们俩,是因为高并发场景下,万一遇到网络问题,可能会导致你跟数据库的Socket连接异常无法通信,此时你Socket可能一直卡死等待某个请求的响应,然后其他请求无法获取连接,只能是重启系统重新建立连接才行

所以设置一下超时时间,可以让网络异常之后,连接自动超时断开重连

(3)maxActive

最大连接池数量,一般建议是设置个20就够了,如果确实有高并发场景,可以适当增加到3~5倍,但是不要太多,其实一般这个数字在几十到100就很大了,因为这仅仅是你一个服务连接数据库的数量,你数据库整体能承受的连接数量是有限的

而且连接越多不是越好,数据库连接太多了,会导致cpu负载很高,可能反而会导致性能降低的,所以这个参数你一般设置个20,最多加到个几十,其实就差不多了

更多的,你反而应该是优化你每个请求的性能,别让一个请求占用连接太长的时间