使用RethinkDB节点驱动程序运行并行查询比使用每个请求打开多个连接更好吗?或者这实际上是一种很好的方式来满足我的需求?我宁愿远离连接池/第三方软件包。有问题的应用程序有一个包含函数的单例,用于包装RethinkDB查询。这些函数处理创建和关闭连接。这种模式允许我以最小的开销要求多个路由器中的数据库服务,而不必知道每个请求。用于解释被查询的数据无关的示例:
database.js
var r = require('rethinkdb');
module.exports = {
getApples: function(callback) {
r.connect(/* config */)
.then(function(conn){
r.db('fruitDatabase').table('apples').run(conn)
.then(function(cursor){
return cursor.toArray();
})
.then(function(apples){
return callback(null, apples);
})
.finally(function(){
return conn.close();
});
});
},
getPotatoes: function(callback) {
r.connect(/* config */)
.then(function(conn){
r.db('vegetableDatabase').table('potatoes').run(conn)
.then(function(cursor){
return cursor.toArray();
})
.then(function(potatoes){
return callback(null, potatoes);
})
.finally(function(){
return conn.close();
});
});
}
};
现在,我需要创建一个显示所有苹果和所有土豆的页面/端点,所以我目前通过页面路由器中的async.parallel调用这两个函数:
pages.js
var pages = require('express').Router(),
async = require('async'),
db = require('./database');
pages.route('/food')
.get(function(req, res, next){
async.parallel({
apples: db.getApples,
potatoes: db.getPotatoes
}, function(err, data){
if(err) return next(err);
res.render('food',
{
apples: data.apples,
potatoes: data.potatoes
});
});
});
思考?如果4个并联(或更多)连接打开怎么办?
答案 0 :(得分:1)
如果您不能等待官方驱动程序获取连接池,您还可以使用中间件为每个请求打开连接,如官方文档中的this example:
app.use(createConnection); // Create a RethinkDB connection
function createConnection(req, res, next) {
r.connect(config.rethinkdb, function(error, conn) {
if (error) {
handleError(res, error);
}
else {
// Save the connection in `req`
req._rdbConn = conn;
// Pass the current request to the next middleware
next();
}
});
}
答案 1 :(得分:0)
我认为RethinkDB可以很好地处理许多并行连接。它也可能更容易使用。如果你为所有人使用共享连接,我们必须在连接中断时重新尝试连接,并且必须确保它在请求或服务器的生命周期中是开放的。
此RethinkDB驱动程序https://github.com/neumino/rethinkdbdash在自己的连接上运行每个查询。
驱动程序每个连接执行一个查询。现在rethinkdb / rethinkdb#3296已解决,将来可能会更改此行为。
更重要的是,如果您将更改Feed添加到您的应用中,您很可能希望根据http://docs.rethinkdb.com/2.1/api/javascript/changes/
在自己的连接上更改Feed在自己的连接上打开更改源是个好主意。如果不这样做,那么在同一连接上运行的其他查询将遇到不可预测的延迟峰值,而连接会阻止更多更改。
所以,换句话说,我说继续,让我们通过使用许多并行连接使它变得简单和容易。
答案 2 :(得分:-1)
我相信这个答案的信息已经过时了。我已经开了一个新问题here