2017-07-16 38 views
1

我有一個Node.js腳本和一個PostgreSQL數據庫,我將使用一個維護與數據庫連接池的庫。PostgreSQL:使用相同的連接或從池中獲取另一個連接?

說我有,在腳本的不同部分數據庫多次(一個交易)查詢腳本,我怎麼知道我是否應該獲得一個連接/客戶端和重用它貫穿*或爲每個查詢從池中獲取新客戶端? (兩者都有效但性能更好)

* taskpg-promise庫中,connectnode-postgres庫中。


... 
// Acquire connection from pool. 
(Database query) 
(Non-database-related code) 
(Database query) 
// Release connection to pool. 
... 

... 
// Acquire connection from pool. 
(Database query) 
// Release connection to pool. 
(Non-database-related code) 
// Acquire connection from pool. 
(Database query) 
// Release connection to pool. 
... 
+0

你讀過這個嗎? - [Chaining Queries](https://github.com/vitaly-t/pg-promise/wiki/chaining-queries)。 –

+0

@ vitaly-t爲什麼第二種方法「耗盡游泳池」?客戶在每次查詢後都不會獲得發行版嗎? – Code

+0

由於高併發性而耗盡嘗試並行執行的查詢次數多於池中可用連接的總數。新的將被卡住,等待連接在池中可用。這就是爲什麼在繁忙的系統中使用任務很重要。 –

回答

0

您可以使用節點的Postgres模塊,讓您工作更加容易。 關於你在什麼時候使用游泳池的問題是簡短的答案。

PostgreSQL服務器每個連接一次只能處理1個查詢。 這意味着如果你有1個全球新的pg.Client()連接到你的 後端,你的整個應用程序會因爲postgres 對查詢的響應速度而變得瓶頸。它確實會將所有內容排隊,每個查詢都排隊等候 。是的,它是異步的,所以這是沒問題的...但是,你會不會把你的吞吐量乘以10倍?使用pg.connect將 pg.defaults.poolSize設置爲理智(我們做25-100,不確定 正確的數字)。

新的pg.Client適用於您知道自己在做什麼的情況。當您因爲某種原因需要單一長期客戶的 或需要非常仔細地控制生命週期時 。一個很好的例子是使用 LISTEN/NOTIFY。偵聽客戶端需要在周圍並連接 而不是共享,因此它可以正確處理NOTIFY消息。其他 的例子是打開一個1-off的客戶端來殺死一些掛起的東西或命令行腳本。

這裏是該模塊的鏈接。 希望這會有所幫助。 https://github.com/brianc/node-postgres

你可以在那裏看到關於池的文檔。謝謝:)

而關於關閉池,它提供了完成的回調,當你想要關閉該池時可以調用回調。

0

我不確定您正在使用的池是如何工作的,但通常它們應該重用連接(不要在使用後斷開連接),因此您不需要關心緩存連接。

相關問題