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

时间:2012-04-16 12:30:04

标签: 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();
}
?>

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

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

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

2 个答案:

答案 0 :(得分:5)

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

PHP驱动程序使用持久连接,如果(不调用 - >关闭)你在一个紧凑的循环中运行“new Mongo”,就像在你的例子中一样,驱动程序将建立新的连接重用已有的。

答案 1 :(得分:0)

你会得到一个致命的错误:

PHP Fatal error: Uncaught exception 'MongoConnectionException' with message 'Cannot assign requested address' in /home/pierre/test.php:3 Stack trace: #0 /root/test.php(3): Mongo->__construct('mongodb://local...') #1 {main} thrown in /home/pierre/test.php on line 3

c=0; while [ $c -le 20000 ]; do php test.php; c=$[c+1]; done

使用mongodb和默认配置的Testet。 MongoDB继续运行,其他脚本继续工作。也许你应该考虑使用像jobserver,gearman这样的东西。