2009-12-04 99 views
2

我只是在Prolog中測試一個小腳本來檢查MySQL連接的健全性。在建立大約3000多個連接後,連接會隨機失敗。 MySQL Server中是否存在連接數量限制經過3000多次嘗試後mysql連接失敗

:-dynamic db_connection/1. 

sanity_check_open_db:- 
      odbc_connect('myDSN', _, 
      [ user(bob), 
       password(pop), 
       alias(myDSN), 
       open(once) 
      ]), 

      ( db_connection(_), 
       retractall(db_connection(_)) 
      ; assert(db_connection(myDSN))). 

sanity_chec_close:- 
      ( db_connection(C), 
       odbc_disconnect(C), 
       retractall(db_connection(C)) 
      ; write('Error: No connection opened to close')). 

sanity_check_open_close(10000). 

sanity_check_open_close(N):- 
    format(atom(C),'~wth Iteration~n',[N]), 
    write(C), 
      sanity_check_open_db, 
      sanity_chec_close, 
      N1 is N + 1,!, 
      sanity_check_open_close(N1). 

回答

2

即使在TCP連接關閉後,TCP連接也會佔用內核內存。如果你說:

netstat -na |grep WAIT 

我想你會發現,大多數的3000個連接仍處於TIME_WAIT狀態,一般持續120秒。在您的情況下,它可能會優化爲較低的值,但仍然很長,例如30秒。如果您的程序在此時可以建立足夠的連接,那麼您可以運行內核以保留內存,以便跟蹤TCP連接。

+0

但是,當我嘗試使用MSSQL服務器相同的腳本,並嘗試10000連接時,它很好。這是一個很大的驚喜。 – JPro 2009-12-04 12:18:59

+0

進行netstat檢查。您可能會發現連接處於其他某種狀態,或者處於不同的WAIT狀態或類似FIN_RCVD狀態,這表明您的基礎數據庫驅動程序未正確關閉連接。 – 2009-12-04 12:31:58

+0

我想,既然你接受了我的回答,你就會得出一些結論。小心分享? – 2009-12-07 15:41:49