与MongoDB的连接未关闭时会发生什么?

Rya*_*mms 5 php mongodb mongodb-php

我有以下PHP脚本基本上连接到MongoDB,写入文档,然后关闭连接19000次:

<?php
for($i=0; $i < 19000; $i++) {
    $con = new Mongo("mongodb://localhost:27017");
    $db = $con->selectDB('test');

    $col = $db->selectCollection('close_wait_test');
    $col->insert(array('Test' => 'Value1'));

    $con->close();
}
?>
Run Code Online (Sandbox Code Playgroud)

运行此脚本一次运行正常,但如果我在几秒钟后运行脚本,我会得到"无法分配请求的地址"异常,这是可以理解的,因为服务器系统可能用完了端口.

但是,如果我删除$ con> close(); 我可以一遍又一遍地运行该脚本,而不会对数据库造成任何明显的压力.我假设这是因为连接到数据库是持久的并且在脚本上重用相同的初始连接.

我想知道的是,如果20K +不同用户运行1圈这个脚本的同时,会发生什么样的数据库?例如,可用连接是否会耗尽,因为每个用户需要创建一个到数据库的连接?或者所有这些用户都使用第一个用户创建的相同初始连接?

Der*_*ick 5

你不应该在每次迭代时调用 - > close().如果您调用close,则告诉驱动程序不要重用持久连接.如果您在紧密循环中运行此操作,则操作系统将耗尽端口以使用,因为它们都处于TIME_WAIT状态.

PHP驱动程序使用持久连接,如果(不调用 - > close)在紧密循环中运行"new Mongo",就像在您的示例中一样,驱动程序将不会建立新连接并重用已存在的连接.