一、 问题
用.net 进行多线程的mysql数据查询和更新,发现程序启动后,就会报这个错误。
Too many connections
二、 分析
1.数据库端
用show processlist;查看连接清单。发现很多连接都在sleep,并且持续增加。
show variables like '%max_connections%';查看mysql的最大连接数发现只有100多。
连接增加到最大的连接数时,不在增加,也没有新的数据库连接产生。
2.程序端
每个线程内频繁的在用.net 创建mysql的连接,但每次都会进行close.
代码片段如下:
string ConnectStr = Connectconfig.GetReadNameConfig("MySql");
MySqlConnection conn = new MySqlConnection(ConnectStr);
connect.Open();
//做些事情
connect.Close();
connect.Dispose();
3.问题点:
明明每次都关闭和释放掉了,为什么在mysql的连接里面,连接没有自动释放掉,而是仅仅sleep了。
4.分析:
经过分析只要创建了连接,并且open,mysql里面优惠存储这个连接,不论是否close。因为mysql的机制是如果你下次再用这个连接,直接open就好了。不用每次都创建连接,对mysql也是消耗。
三、解决
方案一(治标不治本):利用mysql的超时机制+设置最大连接数
将mysql的最大连接数设置成1000,将超时时间设置成30(秒),也就是说还没等到连接数达到设置的最大值时,第一个连接已经因为超时被释放掉了。这里有个前提,就是第一个连接后续不会再用到了,但一般能遇到这个问题的,估计第一个连接很难会在程序中再次使用。
设置超时方法:
max_connections=1024
设置最大连接数方法, 配置文件中加:
wait_timeout=30
interactive_timeout=30
方案二:
遇到这个问题首先是在线程中频繁的 进行了new 连接的操作,如果将线程内只new一次mysql的连接,而后只使用此连接,既可解决问题。