nodejs mongodb驱动程序在空闲时丢弃连接

Fur*_*far 5 mongodb node.js

nodejs mongodb驱动程序在空闲时断开连接并且不重新连接.

背景

下面的脚本连接到mongodb并在全局变量"db"中存储对数据库的引用

config = require("./config.js");
express = require("express");
mongodb = require("mongodb"); 

db = null;

options = {
  auto_reconnect: true,
  db: {
    w: 1
  }
};

mongodb.MongoClient.connect(config.mongo, options, function(err, database) {

  if (err !== null)
    return console.log(err);

  db = database;
  console.log("successfully connected to mongodb");

  db.on("close", (function() {
    return console.log("Connection to database closed automagically " + arguments);
  }));

  db.on("error", function(err) {
    return console.log("Db error " + err);
  });

  app.listen(port);

  return console.log("listening for connections on " + port);

});
Run Code Online (Sandbox Code Playgroud)

每当我从客户端收到插入请求时,都会调用以下函数:

insert = function(collectionName, object) {
  return db.collection(collectionName).insert(object, {w: 1}, (function(err) {
    return console.log("insert complete with err = " + err);
  }));
};
Run Code Online (Sandbox Code Playgroud)

问题

当服务器在很长一段时间后收到插入请求时,它会无声地失败,或者有时会抛出错误说明 unable to insert object (Error: failed to connect to [host:port])

有没有办法防止这种行为?我试图使用auto_reconnect选项并写下1的关注但这些都没有帮助.

谢谢!

Fur*_*far 4

解决了!

  1. 将 server.socketoptions.keepAlive 设置为 1。只需像这样更新选项对象:

    options = {
      auto_reconnect: true,
      db: {
        w: 1
      },
      server: {
        socketOptions: {
          keepAlive: 1
        }
      }
    };
    
    Run Code Online (Sandbox Code Playgroud)
  2. 定期对数据库执行 Ping 操作。下面的代码片段正是执行此操作:

    printEventCount = function() {
      db.collection("IOSEvents").count(function(err, numberOfEvents) {
        console.log(new Date() + ": error = " + err + ", number of events = " + numberOfEvents);
        ping();
      });
    };
    
    ping = function() {
      if (config.pingPeriod === 0)
        return;    
      setTimeout(printEventCount, config.pingPeriod);
    };
    
    Run Code Online (Sandbox Code Playgroud)

  • socketOptions.keepAlive 是一个数字(毫秒),而不是布尔值。将其设置为 1 可能不是一个好主意。mongolabs 建议 30 秒 (30000) 设置:https://gist.github.com/mongolab-org/9959376 (2认同)