2015-12-12 128 views
1

每次查詢數據庫時,是否需要使用pg.connect()?看在githhub頁面和wiki後,示例顯示了pg.connect回調像這裏面的查詢(註釋是從GitHub的例子,我沒有寫他們)使用node-postgres查詢postgres db

//this initializes a connection pool 
//it will keep idle connections open for a (configurable) 30 seconds 
//and set a limit of 20 (also configurable) 
pg.connect(conString, function(err, client, done) { 
    if(err) { 
    return console.error('error fetching client from pool', err); 
    } 
    client.query('SELECT $1::int AS number', ['1'], function(err, result) { 
    //call `done()` to release the client back to the pool 
    done(); 

    if(err) { 
     return console.error('error running query', err); 
    } 
    console.log(result.rows[0].number); 
    //output: 1 
    }); 
}); 

的意見混亂,因爲它聽起來像pg.connect()正在爲每個調用創建一個新的客戶端池,這顯然是效率低下的。我在創建客戶端的文檔中看到了其他示例,但我想使用客戶端池。

+0

如果您想避免連接複雜性,請使用[pg-promise](https://github.com/vitaly-t/pg-promise) –

回答

2

是的pg.connect是推薦的做事方式。如github頁面所述:https://github.com/brianc/node-postgres。它不會爲每個請求創建一個池,而是一個新請求將創建一個「池」,並將所有後續查詢添加到該連接,直到超時30秒。 //它將保持空閒連接打開(可配置)30秒因此,當應用程序未被使用時沒有連接,但是一旦您每秒收到一些查詢,它們都會在該連接上排隊。超時和隊列數量可以改變。

+0

您能否澄清一下,「它沒有爲每個請求創建池,而是一個新的請求會創建一個「池」,並將所有後續的查詢添加到該連接「?假設我有兩個帶有db調用的http路由。一個用戶去路由A,pg.connect()創建一個客戶端池並執行請求。現在另一個用戶去路由B(30秒內)。路由B中的pg.connect()是否使用路由A中創建的池中的現有客戶端,還是創建自己的池?我想pg.connect()重用現有池中的連接並僅在需要時創建池,但我必須問。 – user137717

+1

是的,路由B使用現有的連接,pg節點不關心你是如何路由或哪個表,只要你打到同一個數據庫。 – Saad