MySQL数据库有关连接超时的参数设置
一、问题引入
前段时间在制作MC服务器插件,用到了一款需要连接数据库的插件,但是奇怪的是这个插件被加载时一开始总是运行得好好的,但是每经过8个小时之后就会离奇报错,查看报错内容讲的是数据库连接被意外关闭。为了弄清并解决这个问题,我对这些相关参数进行了简单的研究,作此记录。
二、参数解析
1、对于Mysql服务器
1) 最大连接数(max_connections)
含义:允许同时连接到MySQL服务器的最大客户端数量。
作用:防止服务器被过多连接压垮。
建议:设置应根据并发访问需求和系统资源(内存、CPU)来调整。
2) 等待超时(wait_timeout)
含义:服务器关闭空闲连接之前等待的秒数(适用于非交互连接)。
作用:控制空闲连接的存活时间,节省资源。
建议:对于Web应用,建议设置较小的值(如60秒),防止连接“挂死”。
2、对于连接Mysql的客户端
1) 连接池最大大小(maximum-pool-size)
含义:最大连接池大小,表示最多允许同时存在的数据库连接数。
作用:控制数据库资源消耗,防止连接过多导致数据库性能下降。
2) 连接池最小大小(minimum-idle)
含义:连接池中保持空闲连接的最小数量。
作用:保证有至少几个个空闲连接可立即使用,避免新建连接时的延迟。
连接最大存活时间(maximum-lifetime)
含义:一个连接在连接池中最大存活时间,超时后会被关闭并替换。
作用:避免长时间使用一个连接导致数据库连接“老化”或因超时被中断。
注意:应小于数据库设定的 wait_timeout
连接保活间隔(keepalive-time)
含义:心跳检测间隔时间(单位:毫秒),用于主动“ping”数据库防止连接被断开。
作用:防止由于网络设备或数据库设置导致的连接超时,设为0表示禁用 keep-alive 功能。
获取连接允许等待的最大时长(connection-timeout)
含义:等待获取连接的最大时间(单位:毫秒)。
作用:当所有连接都在使用时,最多等待几秒获取新连接,否则报错。
3、问题分析
这么一来服务器插件报错的原因便可以推断出来了:
插件每隔8小时就报错是因为Mysql服务器本身的wait_timeout为28800秒及8小时,每次经过8小时这个连接就被服务器强行终止,然后插件再次尝试获取连接时发现连接已经不存在,所以报错。这个问题在于插件本身的配置没有弄好,我们应该将插件连接池中的mamximum-lifetime值改得比waitime_out小,这样让插件自己在连接被服务端强行关闭前自己主动释放这个空闲连接(如果后面还需要用到这个连接就再次从连接池中获取),避免了报错。