我使用php建立了一个使用cassandra和phpcassa的事件api。
最近,我创作了一个node.js + helenus替换相同的api。完成后,我开始使用ab工具对node.js代码进行基准测试。但是,在cassandra上插入1000多次后,连接可能会丢失并且故障转移代码正在运行。我在每次请求发生后都向cassandra插入异步。
我在节点应用启动时实例化ConnectionPool
对象。但是,我在每个请求中使用pool.connect()
函数。
pool.connect()
是否会启动新连接或绑定ConnectionPool
对象的现有连接?
注意:
在phpcassa中,我没有遇到这样的问题可能因为我正在插入cassandra同步。
我正在使用5个cassandra节点
答案 0 :(得分:2)
是的,pool.connect()
每次调用时都会创建一个到池的新连接,因此通常只需在应用程序启动时调用它一次,并将该连接传递给任何需要它的模块或方法。
我通常使用模块来执行此操作
module.exports = function(app, cb) {
var domain = require('domain'),
d = domain.create(),
helenus = require('helenus'),
d.run(function() {
var pool = new helenus.ConnectionPool({
hosts : ['localhost:9160'],
user : "",
password : "",
keyspace : 'something',
cqlVersion : '3.0.0'
});
pool.connect(function(err, keyspace){
if(err){
cb(err, null);
} else {
cb(null, pool);
}
});
pool.on('error', function(err) {
cb(err, null);
});
});
d.on('error', function(err) {
console.log('error', err.stack);
cb(err, null);
});
}
用这样的东西(真的简化)把它称为我的应用程序
var express = require('express');
var app = this.express();
var database = require('db');
database(app, function(err, conn) {
if (err==null) {
// connected, do stuff
conn.cql("SELECT * FROM table WHERE KEY = ?", [what], function(err, result) {
if (err==null) {
// get result
}
});
}
});
我已经使用了数百万条记录,连续插入和大量查找,没有任何问题,Cassandra比我尝试过的任何其他数据库都表现得更好。