springboot项⽬mysql连接过多问题排查与解决
背景
我们⾃⼰平台的产品发现指定的mysql数据库后台发现连接⾮常多,过多的连接对于数据库是⼀种负担。这些连接完成SQL执⾏任务后空闲着啥事也不⼲,⽩⽩占⽤内存资源,如果这些连接堆积起来,将导致MySQL超过最⼤连接数,从⽽⽆法新建MySQL连接,有可能导
致“Too many connections”的错误。
解决
1、
⼀反馈连接多,我第⼀件事是查看mysql现在到底有多少连接。
SELECT count(*) FROM information_schema.PROCESSLIST WHERE DB = ‘bcloud_dev001’
去查看到底bcloud_dev001这个数据库占⽤了多少连接。 ⼀看竟然有1030个连接。
SELECT * FROM information_schema.PROCESSLIST WHERE DB = ‘bcloud_test001’ ORDER BY TI
ME desc limit 50
如图所⽰,发现应该不是存在泄露以及别的情况,因为数据TIME⼤值的很少,⽽且都是在sleep状态 (sleep状态就是等待客户端向它发送执⾏语句的状态)。(如果泄露的话,连接没有关闭,那么连接 会⼀直存在下去。⽽且会出现⼤量的长期存在的联接。当然了 这个要结合这连接池的配置⼀起看,初始化连接与当前连接个数⽐较)
2、
然后我转⼿去springboot中关于连接池的配置。springboot默认的连接池是hikari连接池,这⼀块不细讲,会另开⼀篇⽂章讲解。
到配置以后发现还是竟然最⼩的连接数的值没有设置,最⼤的设置到了1024。那么问题其实就解决了,
spring到底是干啥的官⽹中对于最⼩值的配置解释为
minimumIdle
This property controls the minimum number of idle connections that HikariCP tries to maintain in the
pool. If the idle connections dip below this value and total connections in the pool are less than maximumPoolSize, HikariCP will make
a best effort to add additional connections quickly and efficiently. However, for maximum performance and
responsiveness to spike demands, we recommend not setting this value and instead allowing HikariCP to act as a fixed size connection pool. Default: same as maximumPoolSize
它的默认值为 maximumPoolSize ⼀样,所以相当于初始化的时候就相当于启动了⼀个最⼤值的参数的连接池。
后续⾃⼰更改了配置
#指定连接池初始化连接数
spring.datasource.minimum-idle=20
#指定连接池最⼤的连接数,包括使⽤中的和空闲的连接
spring.datasource.maximum-pool-size=500
别的配置我也都反复看了,我觉得默认值就好。官⽹建议这⾥设置⼀个固定的连接池最好。但是这⾥我将最⼤值设置成了500,其实只是不想背锅。项⽬⽐较⼤,啥⼈写的代码都有,万⼀泄露了都是个问题。
多说下 wait-timeout
mysql的wait-timeout 这个配置针对jdbc连接mysql的情况。如果在mysql中有⼤量的sleep的连接,那么设置这个参数就显得很有必要。它的作⽤是在设定的时间内关闭sleep的连接。默认值28800(8个⼩时)
查看wait-timeout的值
show global variables like ‘wait_timeout’;
修改wait-timeout的值(将wait_timeout的值修改为30s)
set GLOBAL wait_timeout=30
这样相当于是设置了全局变量,但是如果重启mysql服务的话,这个值⼜会被初始化。如果想永久的变动此值的话,要在myf的修改此值的⼤⼩。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论