1

サーバーで「lsof|grep node」を実行すると(node.jsアプリを実行すると)、約1000以上の回線(ポート9160へのdb接続)が得られます。各行は次のようになります。

node      17006      root  160u     IPv4         1362100969       0t0        TCP localhost:47813->localhost:9160 (ESTABLISHED)

これはテストnode.jsサーバーであり、非常に単純なことを実行します。(Helenusモジュールを使用してCassandra DBにリクエストを記録します)

現時点で接続が1〜2しかないはずなのに、開いている接続が非常に多いことに驚きました。

これは、ノードアプリでDB接続を適切に終了していないことを意味しますか?私のコードは以下の通りです。ありがとう。

var express = require('express')
 , routes = require('./routes')
 , app = express.createServer();


        app.configure(function(){
                        app.use(express.bodyParser());
                        app.use(express.methodOverride());
                        app.use(app.router);
                        });

        process.on('uncaughtException', function (err) {
                        logger.error('Caught exception: ' + err);
                        });

        function respond_test(req, res, next) {
                        var q = JSON.parse(req.query.q);
                        insert_db(q);
                        res.send('OK');
       }

       function insert_db(q) {
    var helenus = require('helenus'),
            pool = new helenus.ConnectionPool({
                 hosts      : ['localhost:9160'],
                    keyspace   : 'Test',
                    timeout    : 3000
        });

    pool.on('error', function(err){
                logger.error(err.name, err.message);
    });

           //makes a connection to the pool, this will return once there is at least one
           //valid connection, other connections may still be pending
           pool.connect(function(err, keyspace){
                        if(err){   throw(err);    }

                       keyspace.get('Test', function(err, cf){
                                        if(err){    throw(err);     }
                                        cf.insert(Date.now(), q, function(err){
                                                if(err){  throw(err);   }
                                       });
                         });
             });
    pool.close();
        }

        app.get('/test', respond_test);
       app.listen(80);
4

2 に答える 2

2

すべてのリクエストで、cassandraに効果的に接続および切断しています。プールは接続を開いたままにするように設計されているため、常に開閉する必要はありません。接続の作成と破棄にはコストがかかるため、これによりパフォーマンスが大幅に向上します。コードを少しリファクタリングして、コードがどのように使用されるかを理解できるようにしました。私はあなたを助けるためにそこにいくつかのコメントを追加しました:

var express = require('express'),
    routes = require('./routes'),
    app = express.createServer(),
    //define cf in this scope to be set once connected
    test_cf;


function respond_test(req, res, next) {
  var q = JSON.parse(req.query.q);

  test_cf.insert(Date.now(), q, function(err){
    if(err){
      res.send('ERROR');
      throw(err);
    } else {
     res.send('OK');
    }
  });
}

var helenus = require('helenus'),
    pool = new helenus.ConnectionPool({
      hosts      : ['localhost:9160'],
      keyspace   : 'Test',
      timeout    : 3000
    });

app.configure(function(){
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
});

process.on('uncaughtException', function (err) {
  logger.error('Caught exception: ' + err);
});

pool.on('error', function(err){
  logger.error(err.name, err.message);
});

pool.connect(function(err, keyspace){
  if(err){
    throw(err);
  }

  keyspace.get('Test', function(err, cf){
    if(err){ throw(err); }
    test_cf = cf;
    //don't start listening until connected
    app.listen(80);
  });
});

app.on('close', function(){
  //close the pool if we stop listening on http
  pool.close();
});

app.get('/test', respond_test);
于 2012-03-22T17:11:50.587 に答える
1

なぜなら、各操作で新しいプールを作成するからです。毎回新しい接続を作成するのではなく、プールから接続を取得することになっています。これは、通常よりも接続プールの利点です。プールが行うことは、多数の接続を開き、将来の要求のためにそれらを存続させることです。

于 2012-03-20T20:12:48.737 に答える