1

我有一个应用程序一直在最大限度地连接到 MongoDB 的数量,我假设如果驱动程序设置正确,你不需要担心关闭连接。

我见过有人提到通用池模块,但是使用 Node 和 MongoDB 关闭或池化连接的最佳过程是什么?

这是我的应用程序连接代码:

var sys = require("sys");
var app = require('http').createServer(handler);
var io = require('socket.io').listen(app);

app.listen(1337);

io.configure(function () {
io.set('authorization', function (handshakeData, callback) {
    callback(null, true);
    });
});

function handler (req, res, data) {
    sys.puts('request made to trackerapp.js'); 
    res.writeHead(200);
    res.end(data);
}

io.sockets.on('connection', function (socket) {
  socket.on('adTracker', function (data) {
  var adRequestData = data;
  var databaseUrl = "mongodb://dbuser:dbpass@mongolab.com/tracker";
  var collections = ["cmnads"]
  var db = require("mongojs").connect(databaseUrl, collections);

    db.cmnads.insert({adRequest : adRequestData},function(err, updated) {
        if( err || !updated ) console.log("mongo not updated" + err);
        else console.log("data stored");
      });
    });
});
4

2 回答 2

1

看到 JohnnyHK 的评论后,我能够将连接事件从 Socket.io 连接中拉出,并且工作正常,请参阅下面的解决方案:

var databaseUrl = "mongodb://dbuser:dbpass@mongolab.com/tracker";
var collections = ["cmnads"];
var db = mongojs.connect(databaseUrl, collections);

io.sockets.on('connection', function (socket) {
  socket.on('adTracker', function (data) {
  var adRequestData = data;

  //vars for MongoDB used to be created here... so new connect function was called on every request to socket.io

  db.cmnads.insert({adRequest : adRequestData},function(err, updated) {
      if( err || !updated ) console.log("mongo not updated" + err);
        else console.log("data stored");
      });
    });
});
于 2013-01-29T15:31:08.140 回答
0

我在我的快速应用程序中使用的一项似乎取得了一定成功的技术是打开一个与 mongo 实例的连接(从而获得一个连接池),然后在任何地方共享该数据库(现在处于“连接”状态)实例需要。像这样的东西:

server = new Server(app.settings.dbsettings.host, app.settings.dbsettings.port, {auto_reconnect: true, poolSize: 5})
db = new Db(app.settings.dbsettings.db, server, {native_parser:false})
db.open(function(err, db) {
  app.db = db;
  server = app.listen(app.settings.port);
  console.log("Express server listening on port %d in %s mode", app.settings.port, app.settings.env);

  require('./apps/socket-io')(app, server);
});

在程序进入等待侦听状态之前,这会在我的应用程序中连接到最高级别的数据库。

在我使用这种模式之前,每当我需要与数据库交互时,我都会创建一个新的数据库对象。我发现的问题是新的数据库对象会创建一个新的线程池,消耗一堆端口。这些从未被正确清理过。一段时间后,托管该应用程序的机器将耗尽端口!

无论如何,我所展示的代码的变体应该是我相信你应该思考的地方。

于 2013-01-28T09:33:33.083 回答