Node.js lsof – 许多打开的数据库连接

当我在我的服务器上运行“lsof | grep node”(运行node.js应用程序)时,我得到了大约1000多行(db连接到端口9160)。 每行看起来像这样:

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

这是一个testingnode.js服务器,做一些非常简单的事情。 (使用Helenus模块将请求logging到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); 

每次请求,您都有效地连接和断开cassandra。 游泳池旨在为您打开连接,因此您不必经常打开和closures。 这将大大提高你的performance,因为创build和销毁连接是昂贵的。 我重构了一下你的代码,让你知道它应该如何使用。 我在那里添加了一些评论来帮助你:

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

因为在每个操作中你都会创build一个新的池。 您应该从池中获取连接,而不是每次都创build一个连接,这是连接池超过常规的优势。 游泳池的function是打开一堆连接,然后让它们继续存活以备将来的要求。