读取0字节后读取超时,在mongodb中等待30.000000秒

时间:2014-07-31 05:46:04

标签: mongodb

当我在mongodb中处理5,000,000条以上的记录时,它会在"Read timed out after reading 0 bytes, waited for 30.000000 seconds"查询中显示此错误find()。请任何人帮助我。

5 个答案:

答案 0 :(得分:9)

在PHP中,您可以将timeout(-1)设置为光标。

PHP示例:

$conn = new MongoClient("mongodb://primary:27017,secondary:27017", array("replicaSet" => "myReplSetName"));
$db = $conn->selectDB(DBname);
$collection = $db->selectCollection(collection);
$cursor = $collection->find();
$cursor->timeout(-1);

Node.js示例:

// Database connect options
var options = { replset: { socketOptions: { connectTimeoutMS : conf.dbTimeout }}};

// Establish Database connection
var conn = mongoose.connect(conf.dbURL, options);

答案 1 :(得分:4)

在PHP中,您可以将参数socketTimeoutMS添加到连接字符串的其他参数,在本例中为90秒。

$conn = new MongoClient("mongodb://primary:27017,secondary:27017", array("socketTimeoutMS" => "90000"));

问候!

答案 2 :(得分:2)

查看mongodb日志文件并在其中查找您的查询 - 执行需要多长时间?如果确实需要很长时间,您是否添加了索引?它们被使用了吗?从mongodb日志文件中剪切/粘贴查询并从mongo shell中尝试 - 并添加" .explain()"在末尾。它会告诉你MongoDB正在执行的执行计划 - 也许你可以从那边攻击你的问题。如果您的查询确实需要超过30秒,那么无论如何,您都可能需要解决它 - 无论驱动程序超时问题如何。

答案 3 :(得分:1)

ensureIndex键并尝试

MongoCursor::$timeout = 600000;

答案 4 :(得分:0)

我在使用php驱动程序删除1-2kk日志记录时发现了这个问题。 基本上我不得不添加超时(我使用索引,只是db有点大)

    $dtObject = new DateTime();
    $dtObject->modify("- " . $interval);
    $date = new MongoDate($dtObject->format("U"));
    $filter = array('dtCreated' => array('$lt' => $date));
    $num = $this->collection->count($filter);
    if ($num > 0)
        $this->collection->remove($filter)->timeout(-1);
    return $num;

这对我有用