2009-12-04 100 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