簡體   English   中英

節點表達中的動態多數據庫切換

[英]Multiple database switching dynamic in node-express

我已經進行了很多搜索以獲得解決我的問題的方法。 但是沒有。 如果有人在這種情況下有經驗,請幫助我。

我已經在用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;

您可以創建配置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.
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM