Node.js lsof - 许多开放的数据库连接

时间:2012-03-20 18:04:02

标签: node.js cassandra connection-pooling lsof helenus

当我在我的服务器上运行“lsof | grep node”(运行node.js应用程序)时,我得到大约1000多行(与端口9160的数据库连接)。每一行都是这样的:

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

这是一个测试node.js服务器,做一些非常简单的事情。 (使用Helenus模块将请求记录到Cassandra DB)

我很惊讶有这么多开放式连接,此时肯定不应该只有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 个答案:

答案 0 :(得分:2)

因为在每个操作中都会创建一个新池。您应该从池中获取连接,而不是每次都创建一个新连接,这是连接池优于常规的优势。池的作用是打开一堆连接,然后为将来的请求保持活动状态。

答案 1 :(得分: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);