Javascript NodeJS的连接池
我有一个应用程序,它已经超过了MongoDB的最大连接数,我假设如果驱动程序设置正确,你就不必担心关闭连接 我见过有人提到通用池模块,但使用Node&MongoDB关闭或池化连接的最佳过程是什么 以下是我的应用程序连接代码:Javascript NodeJS的连接池,javascript,node.js,http,mongodb,connection-pooling,Javascript,Node.js,Http,Mongodb,Connection Pooling,我有一个应用程序,它已经超过了MongoDB的最大连接数,我假设如果驱动程序设置正确,你就不必担心关闭连接 我见过有人提到通用池模块,但使用Node&MongoDB关闭或池化连接的最佳过程是什么 以下是我的应用程序连接代码: var sys = require("sys"); var app = require('http').createServer(handler); var io = require('socket.io').listen(app); app.listen(1337);
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");
});
});
});
我在express应用程序中使用的一种技术似乎有一定程度的成功,那就是打开到mongo实例的连接(从而获得连接池),然后在需要的地方共享该db(现在处于“已连接”状态)实例。大概是这样的:
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);
});
在程序进入wait-listen状态之前,它连接到我的应用程序中最高级别的数据库
在使用此模式之前,每当需要与数据库交互时,我都会创建一个新的数据库对象。我发现的问题是,新的数据库对象将创建一个新的线程池,消耗大量端口。这些东西从来没有好好清理过。一段时间后,承载应用程序的计算机将耗尽端口
无论如何,我所展示的代码的一个变体应该是你应该思考的地方,我相信。我在express应用程序中使用的一种技术似乎有一定程度的成功,就是打开到mongo实例的连接(从而获得连接池),然后共享该db(现在处于“已连接”状态)在任何需要的地方都可以使用实例。大概是这样的:
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);
});
在程序进入wait-listen状态之前,它连接到我的应用程序中最高级别的数据库
在使用此模式之前,每当需要与数据库交互时,我都会创建一个新的数据库对象。我发现的问题是,新的数据库对象将创建一个新的线程池,消耗大量端口。这些东西从来没有好好清理过。一段时间后,承载应用程序的计算机将耗尽端口
无论如何,我所展示的代码的一个变体应该是您应该思考的地方,我相信。在看到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");
});
});
});
在看到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");
});
});
});
调用
mongojs.connect
会打开一个包含5个连接的共享池,但您正在为每个'connection'
事件创建一个新池。谢谢@johnyhk,这就是问题所在,一旦我从socket.io connect函数的MongoJS connect事件中取出它,它就开始正确地进行池化。调用MongoJS.connect
将打开一个包含5个连接的池,这些连接将被共享,但您正在为每个“连接”
事件创建一个新池。谢谢@johnyhk,这就是问题所在,一旦我从socket.io connect函数的MongoJS connect事件中取出它,它就开始正确地汇集东西。如果有人碰到这个,这当然不会像预期的那样在现实世界中工作,因为.connect
方法是异步的。这段代码并不等待数据库可用。如果mongo服务器的延迟很低,并且在实际连接完成后处理了第一个“astracker”事件,那么如果有人碰到这个事件,这当然不会像预期的那样在现实世界中工作,因为.connect
方法是异步的。这段代码并不等待数据库可用。如果mongo服务器的延迟较低,并且在获得实际连接后处理第一个“astracker”事件,那么它可能会对OP起作用