Динамическое переключение нескольких баз данных в выражении узла - PullRequest
0 голосов
/ 28 февраля 2019

Я много искал, чтобы найти решение моей проблемы.но не получил это.если у кого-то есть опыт в таких ситуациях, пожалуйста, помогите мне.

Я создал сервер приложений в узле экспресс с MySQL базой данных.и успешно создать конечные точки API REST, которые успешно работают.

, но наши проекты расширились.приближается новый клиент, поэтому мы должны обслуживать и этих клиентов.эти клиенты могут иметь 1 тыс. пользователей. но схема базы данных такая же.

решение 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;

1 Ответ

0 голосов
/ 28 февраля 2019

Вы можете создать конфиг 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.
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...