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インスタンスへの接続を開き(接続プールを取得)、その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);
});

これは、プログラムが待機リッスン状態に移行する前に、アプリの最上位レベルでデータベースに接続します。

このパターンを使用する前は、データベースを操作する必要があるときはいつでも、新しいデータベースオブジェクトを作成していました。私が見つけた問題は、新しいデータベースオブジェクトが新しいスレッドプールを作成し、多数のポートを消費することです。これらは適切にクリーンアップされませんでした。しばらくすると、アプリをホストしていたマシンのポートが不足します。

とにかく、私が示したコードのバリエーションは、私が信じている思考を行うべき場所であるはずです。

于 2013-01-28T09:33:33.083 に答える