NodeJS的连接池

我有一个应用程序已经最大的连接到MongoDB的数量,我假设如果驱动程序设置正确,你不必担心closures连接。

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

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

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"); }); }); }); 

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

 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"); }); }); }); 

我用我的快速应用程序似乎有一些成功的措施是打开连接到一个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); }); 

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

在我使用这个模式之前,我会创build一个新的数据库对象,每当我需要与数据库交互。 我发现的问题是,新的数据库对象将创build一个新的线程池,消耗一堆端口。 这些从来没有妥善清理。 一段时间后,托pipe该应用程序的机器将用完端口!

无论如何,我所显示的代码的一个变种应该是你应该做你认为我相信的地方。