【问题标题】:mysql connection fails after 3000+ attemptsmysql 连接在 3000+ 次尝试后失败
【发布时间】:2009-12-04 12:01:28
【问题描述】:

我只是在 Prolog 中测试一个小脚本来健全地检查 MySQL 连接。在建立大约 3000 多个连接后,连接随机失败。 MySQL Server 对连接数是否有任何限制

:-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).

【问题讨论】:

    标签: mysql database-connection prolog swi-prolog


    【解决方案1】:

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

    netstat -na |grep WAIT
    

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

    【讨论】:

    • 但是当我使用 MSSQL 服务器尝试相同的脚本时,连接尝试次数为 10000,一切正常。这是一个很大的惊喜。
    • 做 netstat 检查。您可能会发现连接处于其他状态,可能是不同的 WAIT 状态或类似 FIN_RCVD 的状态,这表明您的底层数据库驱动程序没有正确关闭连接。
    • 我想既然你接受了我的回答,你就达成了一些解决方案。愿意分享吗?
    • MySQL 的行为很奇怪。我切换到 MSSQL,现在可以了。我没有检查驱动是否有问题,因为我是从 MySQL 网站下载的。
    猜你喜欢
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多