Javascript RejectionDB和Node.js/Express-为并行查询打开多个连接?
有没有比在每个请求中打开多个连接更好的方法来使用DB节点驱动程序运行并行查询?或者这真的是一个很好的方式来满足我的需求?我宁愿远离连接池/第三方软件包。有问题的应用程序有一个包含包装DB查询的函数的单例。这些函数处理创建和关闭连接。这种模式允许我在多个路由器中以最小的开销要求数据库服务,而不必知道每个请求。解释被查询数据的不相关性的人为示例: database.jsJavascript RejectionDB和Node.js/Express-为并行查询打开多个连接?,javascript,node.js,express,rethinkdb,Javascript,Node.js,Express,Rethinkdb,有没有比在每个请求中打开多个连接更好的方法来使用DB节点驱动程序运行并行查询?或者这真的是一个很好的方式来满足我的需求?我宁愿远离连接池/第三方软件包。有问题的应用程序有一个包含包装DB查询的函数的单例。这些函数处理创建和关闭连接。这种模式允许我在多个路由器中以最小的开销要求数据库服务,而不必知道每个请求。解释被查询数据的不相关性的人为示例: database.js var r = require('rethinkdb'); module.exports = { getApples:
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个连接并行打开(或更多)?我认为RejectionDB可以很好地处理许多并行连接。它也可能更容易使用。如果您对所有人都使用共享连接,我们必须在连接中断时重新尝试连接,并且必须确保它在请求或服务器的整个生命周期中都是开放的 此DB驱动程序在其自己的连接上运行每个查询 驱动程序对每个连接执行一个查询。现在RejectionDB/RejectionDB#3296已经解决,这种行为将来可能会改变 更重要的是,如果你曾经将change feed带到你的应用程序中,你很可能会希望change feed在它自己的连接上根据 在他们自己的连接上打开changefeeds是个好主意。如果不这样做,则在同一连接上运行的其他查询将遇到不可预测的延迟峰值,而连接将阻止更多更改
所以,换句话说,我说继续,让我们通过使用许多并行连接使它变得简单和容易 如果您不能等待官方驱动程序获得连接池,您还可以使用中间件为每个请求打开连接,如从官方文档:
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();
}
});
}
我相信这个答案上的信息已经过时了。我提出了一个新问题啊,它确实可以很好地处理多个并行连接。我应该在问题中澄清,我指的是每个请求的多个连接,而不是典型的每个请求一个连接模式或连接池。编辑问题以反映这一点。谢谢你的回复!