2017-06-30 60 views
0

我看到了由包的作者(What is the proper way to use the node.js postgresql module?)一個計算器信息的評論中說,最好的辦法就是每次pg.connect使用。我想知道這種方法是否與他在npm網站(https://www.npmjs.com/package/pg)上提到的例子不同?Node.js的PostgreSQL的

在我看來,如果我按照你的帖子在stackoverflow上,那麼如果在高峯期有不同的客戶端訪問1000個數據庫,那麼將創建1000個不同的數據庫客戶端連接,並且可能存在數據庫崩潰的風險缺乏內存)。此外,這種方法(每次只使用pg.connect)都有一個連接池,連接被重用,並且只有最大數量的連接由pg.defaults.poolSize設置。如果我錯了,請糾正我的錯誤?

+0

'pg.connect'現已過時,並且在當前版本中將顯示棄用警告。爲了避免所有連接的地方和方式的問題,請嘗試[pg-promise](https://github.com/vitaly-t/pg-promise);) –

回答

0

使每單查詢將產生對每一個查詢的不必要的開銷,一個新的連接。

使用Node.js的Postgres的模塊正確的方法是有一個連接池,你要查詢每次從池中獲取一個連接。

的原因是因爲數據庫崩潰缺乏RAM的不是。有一個postgres數據庫可以打開的最大數量的連接。數量將在postgresql.conf中設置,通常它會比內存崩潰要低得多(除非你故意將其設置爲荒謬的)。

保持一個連接池了好幾個事情:

  1. 它減少了響應時間,因爲你不花不必要的時間開(閉)數據庫連接。
  2. 您總是知道在給定時間打開了多少個連接。即使在您告知連接關閉後,您在連接之前也沒有連接閒置30秒或類似的情況。
  3. 你在你的應用程序中有不可預知的狀態的概率較低顯著當您使用連接池,而不是打開每個查詢新的連接。

此外,我傾向於分配的連接的最大數目的80%至應用程序。 20%是爲複製內容和需要查詢數據庫的數據團隊保留自己的工作而保留的。分配100%也可能導致您的應用程序出現不可預知的狀態。

+0

因此,在stackoverflow文章中使用該方法(pg .connect()每次)打開一個新的連接,直到它達到pg.defaults.poolSize,然後重新使用這些連接,或者我應該去在npm網站的方法? – Ben

+0

node-postgres模塊中應該有一個pg.pool或等價物。你可以使用它。這就是我們在生產中使用的。我們的產品並不是太大規模,但仍然沒有爲我們帶來零問題。 – ardilgulez

1

原則 - 是的。但請記住,驅動程序不能同時執行多個查詢。這就是爲什麼建議使用多個連接的原因 - 但是這會由於其他原因而降低性能,例如太多的套接字,Postgres的最大打開連接數等。此外,還有可能面臨可以不那麼明顯,但很可能取決於你的使用情況的一些問題 - 看到一些相關的問題:

一些模塊,你可能想看看:

  • pooled-pg - 「PostgreSQL與pg兼容的驅動程序,具有更高效的池化策略。」
  • ppooled-pg - 「Promised PostgreSQL驅動程序與更有效的池策略。」