我们正在尝试在快速Nodejs中创建基于mysql DB的后端 - RESTFUL api。我的老板(备受赞誉的mysql大师)坚持认为我们应该使用比1更多的连接池 - 基于用户分组的不同角色。
所以我需要在文件B.js中定义/创建不同的连接池 - >并将它们作为全局变量,以便我以后可以访问它们。
在文件A.js中我有一条这样的路由 - 其中用户可以使用参数调用存储过程。但是,我希望能够定义从哪个连接池调用连接 - 在路由本身(基于会话(req.user.role
)变量)。
那样:
pool1.getConnection(function(err,connection){
if (err) {
connection.release();
res.json({"code" : 100, "status" : "Error in connection database"});
return;
}
console.log('connected as id ' + connection.threadId);
connection.query(query1, val, function (err, rows, fields) {
connection.release();
if(!err) {
var results = JSON.stringify(rows[0]);
console.log(results);
console.log(typeof(results));
console.log(rows[0][0]);
console.log(typeof(rows[0]));
res.send(JSON.stringify(results));
}
});
connection.on('error', function(err) {
connection.release();
res.json({"code" : 100, "status" : "Error in connection database"});
return;
});
});
});
};
指的是pool1,但是如果是其他用户 - > pool1应该连接到其他池 - 在其他文件中定义。 我希望我对自己的问题很清楚。
答案 0 :(得分:0)
我不知道你为什么要这样做,或者你的老板想要这样做,更多的连接池不会使应用程序更有效率,它只会让人迷惑。由于MySQL服务器有其客户端限制。顺便说一下,如果你想知道用户的角色,你必须首先连接数据库并获取用户数据。为什么不使用相同的连接来做其他事情,那就没事了。
答案 1 :(得分:0)
您不需要使用全局变量,可以导出包含每个池的对象:
// B.js
module.exports = {
regular : mysql.createPool({ ... }),
admin : mysql.createPool({ ... }),
};
// A.js
const pools = require('./B');
...
let pool = pools[req.user.role];
if (! pool) {
throw Error('there is no pool for user role ' + req.user.role);
}
pool.getConnection(...);
因此,这声明了两个池,一个用于“常规”用户,一个用于“admin”用户。它使用req.user.role
的值(假设它包含两个值中的一个:“regular”或“admin”,但这只是为了本例的目的)来选择应该使用的池。
我不确定拥有多个池的好处是什么,除非它们连接到两个不同的数据库或使用不同的数据库凭据。
答案 2 :(得分:-1)
我们有多个UI开发人员,每个人都开发了一个角色,所以我们不希望所有的UI开发人员都能看到所有的商店程序......(那个老板)