某项目在上线前测试时出现数据连接爆满的问题。
数据库:MySQL 5.7.31
初步分析,问题不在数据库方面,而在程序访问数据库的数据库连接设置:
<add name="ConnectionString" connectionString="XpoProvider=MySql;server=192.168.1.188;user id=root; password=xxxxxx; database=data;Pooling=true;Max Pool Size=30000;connect timeout=120;persist security info=true;CharSet=utf8" providerName="MySql.Data.MySqlClient" />
扩展信息:
原则:
代码控制的数据库Timeout <= 连接字符串中timeout <= 数据库设置的Timeout
代码控制的数据库MaxConnections <= 连接字符串中MaxConnections <= 数据库设置的MaxConnections <= 数据库版本MaxConnections限制数 <= 操作系统的连接数
数值设置形成明显数量差异
mysql sql语句修改timeout
set global wait_timeout=10;
set global interactive_timeout=10;
在应用程序连接池关闭之后,相应的数据库连接在数据库端依然保持
应用程序连接池只能管理应用程序侧的Timeout
查看mysql5的手册,发现对wait_timeout的最大值分别是24天/365天(windows/linux)。以windows为 例,假设我们要将其设为21天,我们只要修改mysql5的配置文件“my.ini”(mysql5 installation dir),增加一行:wait_timeout=1814400。这个设置解决登录超时失败的问题不可取,甚至是错误的。程序代码中应该检测数据库丢失并尝试重新连接。
两个参数要同时设置 默认28800S 8小时
[mysqld]
wait_timeout=20
interactive_timeout=20
连接字符串中加入timeout
MySQL <add name="ConnectionString" connectionString="XpoProvider=MySql;server=127.0.0.1;user id=root; password=xxxxxx; database=data;Pooling=true;Max Pool Size=3000;connect timeout=120;persist security info=true;CharSet=utf8" providerName="MySql.Data.MySqlClient" />
MSSQL server=192.168.1.123; Port=1433; uid=root; pwd=root;database=data;pooling=true;min pool size=5;max pool size=512;connect timeout = 20
MySQL几个超时参数(timeout)解释
1. connect_timeout
mysql客户端在尝试与mysql服务器建立连接时,mysql服务器返回错误握手协议前等待客户端数据包的最大时限。默认10秒。
2. interactive_timeout / wait_timeout
mysql关闭交互/非交互连接前等待的最大时限。默认28800秒。
3. lock_wait_timeout
sql语句请求元数据锁的最长等待时间,默认为一年。此锁超时对于隐式访问Mysql库中系统表的sql语句无效,但是对于使用select,update语句直接访问mysql库中标的sql语句有效。
4. net_read_timeout / net_write_timeout
mysql服务器端等待从客户端读取数据 / 向客户端写入数据的最大时限,默认30秒。
5. slave_net_timeout
mysql从复制连结等待读取数据的最大时限,默认3600秒。