Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS的连接池_Javascript_Node.js_Http_Mongodb_Connection Pooling - Fatal编程技术网

Javascript NodeJS的连接池

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

我有一个应用程序,它已经超过了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");
      });
    });
});

我在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起作用