當前位置:首頁 > 網絡編程 > mysql > 正文

Can't connect to MySQL server on 'XXXX' (10055) 解決方案

最近做一個服務器端項目,要用到MySQL 數據庫,但在大用戶量并發的情況下會出現以下錯誤:
 
       Can't connect to MySQL server on'localhost' (10055) 
 
       花了半天時間查找資料得以解決,現做一下總結,希望能幫到大家,有講的不對的地方,歡迎指正,大牛勿噴。
 
 
 
錯誤的背景如下:
 
      系統:Windows Server 2008 R2
 
  數據庫:MySql 5.5
 
  錯誤現象:錯誤是一陣一陣的出現,一會正常,一會不正常
 
 
 
經過一番掙扎驗證,發現將數據庫放在普通的Win7 系統上不會出現該錯誤,所以應該可以排除這種代碼層面的原因,也可以排除是MySQL 配置方面的原因。那到底是什么原因呢?經查資料得到下面這篇文章,
 
http://blog.whitesites.com/How-to-Fix-MySQL-Error-10055__635140180116307813_blog.htm
 
大家應該都能看懂,大體意思是應用程序頻繁的連接訪問數據庫,而系統會為每個連接動態分配一個端口,Windows Server 2008 R2默認可供動態分配使用的端口只有16383 (49152 - 65535)個,(博主寫成了16838,當然這是書寫錯誤,瑕不掩瑜啊),這樣的話,大并發的情況下就會導致動態端口占用完的情況,這是有人會問我的客戶并發量并沒有達到16383,為什么還會出現這種情況?那就涉及到端口重用問題,每個動態分配的端口號在連接關閉后,需要等待一段時間才能重新使用,這個時間是可以改變的,具體做法稍后介紹。分析到這,這個問題應該是可以解決了,具體解決辦法有兩個:
 
 
 
1.      改變可用動態端口范圍
 
在修改之前我們可以查看一下默認到底是多少:
 
netsh int ipv4 show dynamicport tcp
 
netsh int ipv4 show dynamicport udp
 
netsh int ipv6 show dynamicport tcp
 
netsh int ipv6 show dynamicport udp
 
然后可以通過以下命令來配置:
 
netsh int set dynamic start=number num=range
 
例如:
 
netsh int ipv4 set dynamicport tcp start=10000 num=50000
 
netsh int ipv4set dynamicport udp start=10000 num=50000
 
netsh int ipv6set dynamicport tcp start=10000 num=50000
 
netsh int ipv6set dynamicport udp start=10000 num=50000
 
 
 
到此或許我們就有個疑問,我么可以設置的起始端口是多少,最大可以設置多少個端口,官方說明如下:
 
The minimum range of ports that can be set is 255. Theminimum starting port that can be set is 1025. The maximum end port (based onthe range being configured) cannot exceed 65535。
 
也就是說 start的最小值是1025,num指的是范圍,最小值是255,最大值及start + num < 65535.
 
 
 
   官方原文鏈接地址:
 
http://support.microsoft.com/kb/929851/en-us
 
有時候可能需要配置動態端口最大值:
 
因為官方如下描述:
 
If youtry to set up TCP connections from ports that are greater than 5000, the localcomputer responds with the following WSAENOBUFS (10055) error message:
 
An operation on a socket could not be performed because thesystem lacked sufficient buffer space or because a queue was full.
 
就是說當TCP鏈接大于5000時,就會報10055錯誤。
 
 
 
通過注冊表配置動態分配端口的最大值:
 
在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters里加上如下的鍵值:
 
ValueName: MaxUserPort
 
ValueType: DWORD
 
Valuedata: 65534
 
ValidRange: 5000-65534 (decimal)
 
Default:0x1388 (5000 decimal)
 
  官方原文鏈接地址:
 
http://support.microsoft.com/kb/196271/en-us
 
 
 
2.      設置端口復用時間:
 
 
 
可以通過修改或添加如下注冊表字段來配置:
 
在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters加上
 
鍵值:TcpTimedWaitDelay
 
數值類型:REG_DWORD - 時間(以秒為單位)
 
有效范圍:30-300(十進制)
 
默認值:0x78(十進制 120)
 
描述:此參數確定連接在關閉時保持 TIME_WAIT 狀態的時長。只要連接處于 TIME_WAIT 狀態,便不能重新使用套接字對。
 
為了復用的快一些:可以設置為最小值:30
 
 
 
官方文檔:
 
http://support.microsoft.com/kb/314053
 
上一篇:刪除重復數據,保留最小ID的 下一篇:最后一頁
四川快乐12走势图基本