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