mysql连接在3000+;尝试

mysql连接在3000+;尝试,mysql,database-connection,prolog,swi-prolog,Mysql,Database Connection,Prolog,Swi Prolog,我只是在Prolog中测试一个小脚本来检查MySQL连接是否正常。在进行约3000多个连接后,连接会随机失败。MySQL服务器中的连接数量有限制吗 :-dynamic db_connection/1. sanity_check_open_db:- odbc_connect('myDSN', _, [ user(bob), password(pop), alias(myDSN),

我只是在Prolog中测试一个小脚本来检查MySQL连接是否正常。在进行约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).

TCP连接占用内核内存,即使在关闭后也是如此。如果你说:

netstat -na |grep WAIT

我想您会发现,这3000个连接中的大多数仍然处于TIME_WAIT状态,通常持续120秒。在您的情况下,它可能被优化为一个较低的值,但仍然很长,比如30秒。如果您的程序能够在这段时间内建立足够的连接,那么您可以使用为跟踪TCP连接而保留的内存运行内核。

但是,当我使用MSSQL server尝试相同的脚本时,尝试10000次连接,一切都会好起来。这是一个大惊喜。请执行netstat检查。您可能会发现连接处于其他状态,或者是不同的等待状态,或者是类似FIN_RCVD的状态,这表明您的底层DB驱动程序没有正确地关闭连接。我想既然您接受了我的答案,您就找到了一些解决方案。想分享吗?MySQL的行为很奇怪。我切换到MSSQL,现在一切正常。我没有检查驱动程序是否有问题,因为我是从MySQL网站下载的。