2013-05-01 136 views
1

我有一個Node.js應用程序通過node-postgres使用PostgreSQL。我已經開始收到錯誤「對不起,客戶已經太多了」,這讓我想知道我是否創建了太多的客戶端對象,或者是否應該手動斷開它們。目前,我正在創建一個訪問數據庫的每個函數調用的新客戶端對象。例如:節點應該在什麼時候創建數據庫連接?

var db { 
    checkDetails : function() { 
    var client = new pg.Client(conString); 
    ... 
    }, 

    amendDetails : function() { 
    var client = new pg.Client(conString); 
    ... 
    }, 
... 
} 

這是正確的還是應該在其他地方創建一個客戶端對象?或者我應該打電話給client.end()?作爲我使用的回調風格的例子沒有包括這個,我認爲這是沒有必要的。

+0

你應該使用'Singleton'數據庫連接,這意味着你的代碼中只有一個客戶端可以處理所有的查詢。並且你不必使用'end()' – williamC 2013-05-01 12:49:27

+0

也應該監聽數據庫'close'事件,如果連接失敗,只需重新連接 – williamC 2013-05-01 12:50:30

+0

我注意到客戶端'connect'是異步的,所以使用'EventEmitter '。我不熟悉'node-postgres',但這是我在cassandra中做到的(https://gist.github.com/wwwy3y3/5412976) – williamC 2013-05-01 13:15:04

回答

0

這裏有相當多的有效選擇,包括繼續使用當前的方法,添加諸如PgBouncer之類的東西來使用單例。這些有不同的考慮因素,所以選擇哪一個更好取決於你的具體情況。不過,我會在這裏提及這兩種選擇之間的權衡。

首先是一些基礎知識

PostgreSQL的,像所有其他的RDBMS必須協調訪問各工序間的數據。一般而言,數據訪問方面的並行性越高,您就越等待鎖定。因此一個關鍵是管理並行性。

一方面,PostgreSQL上的單個連接絕不會超出數據庫服務器的單個核心和單個硬盤驅動器主軸。事實上,它甚至不會縮小甚至達到此。另一方面,除非你有50個內核和非常快的硬盤驅動器,否則100個連接最終會花費大部分時間等待其他進程,所以你需要在開始之前瞭解這種權衡。

選項1:單身

一個Singleton數據庫連接是最簡單的方法。請注意,PostgreSQL連接一次只能運行一個查詢,因此您基本上將通過單個接口序列化所有數據庫訪問。這對於事務來說並不合適,並且它對數據庫管理器的期望有很大的限制,但是在低端服務器上,如果允許100個併發連接,則性能將遠遠優於您的數據庫管理器。

選項2:連接池,也許PGBouncer

第二種可能性是,你可以連接到的連接池,而不是數據庫,hanve的的連接池管理連接。這是最靈活的方法,因爲如果需要,它可以爲您提供一個解決事務問題的工具包,並且它可以更好地控制並行度,而不是從單例中獲得。通過連接池,您可以指定要使用多少個連接,是否要池化事務,等等。一般來說,如果你正在尋找可擴展性,這可能是開始的地方。

主要的缺點是,這給你一個軟件來管理,因此有點複雜的成本。但是它也爲您提供了一個可用於管理性能的數據庫連接抽象層。

相關問題