1

当我在我的服务器上运行“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);
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 回答