我已经进行了很多搜索,以找到解决我的问题的方法。但是没有。 如果有人在这种情况下有经验,请帮助我。
我在用MySQL表达数据库的节点中创建了一个应用服务器。 并成功创建可以正常工作的REST API端点。但我们的项目规模扩大了。一个新的客户方法,因此我们也需要为这些客户提供服务。 这些客户端可能有1000个用户。但是数据库架构是相同的。
解决方案1:为每个具有不同端口号的客户端创建单独的服务器和数据库。 但是我认为这不是一个好的解决方案,因为如果我们有100个客户端,我们将无法维护代码库。
解决方案2:为每个客户端创建一个单独的数据库,并在运行时切换数据库连接。 但是我不知道如何实施解决方案2。高度赞赏任何建议。
如果有多个客户端在请求同一服务器,则如何使用端点URL知道需要连接哪个数据库。我有任何其他方法可以解决这种情况。
我的解决方案:创建一个中间件来找出需要哪个数据库并返回连接字符串。这是一个好主意。
中间件。在下面的示例中,我使用包含数据库名称的JWT令牌。
const dbHelper=new db();
class DbChooser {
constructor(){
this. db=
{
wesa:{
host: "xxx",
user: "xxxx",
password: "xxxxx",
database: "hdgh",
connectionLimit:10,
connectTimeout:30000,
multipleStatements:true,
charset:"utf8mb4"
},
svn:{
host: "x.x.x.x.",
user: "xxxx",
password: "xxx",
database: "xxx",
connectionLimit:10,
connectTimeout:30000,
multipleStatements:true,
charset:"utf8mb4"
}
};
}
async getConnectiontring(req,res,next){
//console.log(req.decoded);
let d=new DbChooser();
let con=d.db[req.decoded.userId];
console.log(mysql.createPool(con));
next();
}
}
module.exports=DbChooser;
答案 0 :(得分:1)
您可以创建配置JSON。在每个请求上,请求标头都应具有一个基于client_id的client_id,我们可以获取数据库连接的实例。
您的数据库配置JSON
var dbconfig = {
'client1': {
databasename: '',
host: '',
password: '',
username: ''
},
'client2': {
databasename: '',
host: '',
password: '',
username: ''
}
}
您应该声明一个全局对象,以维护每个客户端的单例数据库实例。
global.dbinstances = {};
在每个请求上,您将检查实例是否在全局对象中已经可用。如果可用,则可以继续进行下一个过程,否则它将创建一个新实例。
app.use('*', function(req,res) {
let client_id = req.headers.client_id;
if(global.instance[client_id]) {
next();
} else {
const config = dbconfig[client_id];
connectoDb(config, client_id);
}
}
function connectoDb(config, client_id) {
//.. once it is connected
global.instance.push({client_id: con}); //con refers to the db connection instance.
}