Node.js lsof - много открытых соединений с БД - PullRequest
1 голос
/ 20 марта 2012

Когда я запускаю «lsof | grep node» на моем сервере (на котором запущено приложение node.js), я получаю около 1000+ строк (db-соединения с портом 9160).Каждая строка выглядит следующим образом:

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

Это тестовый сервер node.js, выполняющий что-то очень простое.(регистрация запроса к базе данных Cassandra с модулем Helenus)

Я был удивлен, что было так много открытых соединений, когда на данный момент определенно должно быть не более 1-2 соединений.

Значит ли это, что я неправильно завершаю соединения с БД в приложении Node?Мой код ниже.Спасибо.

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

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Вы эффективно подключаетесь и отключаетесь от Кассандры по каждому запросу.Пул предназначен для того, чтобы держать соединения открытыми, чтобы вам не приходилось постоянно открывать и закрывать.Это значительно повысит вашу производительность, так как создание и уничтожение соединений обходятся дорого.Я немного реорганизовал ваш код, чтобы дать вам представление о том, как он должен использоваться.Я добавил несколько комментариев, чтобы помочь вам:

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);
2 голосов
/ 21 марта 2012

Потому что в каждой операции вы создаете новый пул.Вы должны захватывать соединение из пула, а не создавать новое каждый раз, это преимущество пула соединений перед обычным.То, что делает пул, - это открытие группы соединений, а затем сохранение их для будущих запросов.

...