NodeJS的连接池

时间:2013-01-25 15:33:06

标签: javascript node.js http mongodb connection-pooling

我有一个应用程序已经最大化了与MongoDB的连接数,我假设如果驱动程序设置正确,您不必担心关闭连接。

我见过人们提到了Generic Pool模块但是使用Node& amp;和/或者关闭连接或汇集连接的最佳流程是什么? 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");
      });
    });
});

2 个答案:

答案 0 :(得分: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");
      });
    });
});

答案 1 :(得分: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);
});

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

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

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