2017-09-15 24 views
1

在使用pg-promise構建主/副本postgres連接的情況下,是否有辦法在發生副本中斷時重建這些連接?

而不是在與initOptions傳遞的錯誤函數中做process.exitCode = 1;,並重建服務啓動時只有工作連接...有沒有更好的方法來刪除失敗的連接(甚至更好,如果它的副本和process.exitCode如果它的主要)?在Nodejs中重建連接,pg-promise

const initOptions = { 
    // global event notification; 
    error: (error, e) => { 
     if (e.cn) { 
      //log 
     } 
     process.exitCode =1; 
    } 
}; 

//singleton 
const pgp = require('pg-promise')(initOptions); 


// then for each database in config, we connect and start the service 
+0

我可以做'pgp.end()'但隨後的應用程序需要知道停止接受的連接同時 – Cmag

回答

1

pg-promise模塊是建立在頂部node-postgres,它使用了連接池,能夠自動地恢復斷開的連接的。

爲此目的,你身邊沒有什麼需要的。一旦連接再次可用,您的查詢將再次開始成功。

根據您尋找的邏輯,您可以在主連接丟失時專門做process.exit(),而忽略(或僅記錄)副本連接的丟失。 數據庫上下文您可以在對象的構造過程中傳遞,它可以是任何東西 -

規定,兩個通過各自的Database對象使用,你可以用dc參數的幫助區分它們。

例子:

const dbPrimary = pgp(primaryConnection, 'primary'); 
const dbReplica = pgp(replicaConnection, 'replica'); 
全球 error處理器中

然後:

const initOptions = { 
    error: (err, e) => { 
     if(e.cn) { 
      // connectivity issue: 
      console.log(e.dc, 'connection error:', err); 
      if(e.dc === 'primary') { 
       process.exit(1); 
      } 
     } 
    } 
}; 
+0

超級。謝謝你的解釋:)。對於pg-promise與錯誤行爲副本連接進行交談的實例,其客戶端請求將失敗。因此,我們應該確保將另一個副本作爲立即重試進行查詢,或者確保對副本中斷進行process.exit。 – Cmag