簡體   English   中英

打開PostgreSQL數據庫連接的效率

[英]Efficiency of opening PostgreSQL database connections

我們有一個PostgreSQL數據庫來存儲C ++應用程序的數據,並且我們使用libpqxx來連接它。

當前,我們為每個要運行的事務打開一個新的pqxx::connection 在部署中,我們希望每分鍾最多執行大約四或五打事務,並且我們的應用程序將全天候運行24x7x365。

根據PostgreSQL 架構基礎

... [PostgreSQL服務器進程]為每個連接啟動(“ forks”)新進程。

在我看來,我們為每個事務打開一個新的pqxx::connection的方法實際上效率很低,因為我們每分鍾間接產生幾十個新進程。 這是我們真的應該擔心的事情嗎?

在PostgreSQL Wiki上看到PostgreSQL本身並不維護客戶端連接進程池,因此看來我們確實確實需要為此擔心。 如果是這樣,是否存在一種“適當”的方法來無限期保留pqxx::connection對象,以使每次我需要連接到數據庫時都不會派生一個新進程? 請記住,我的應用程序需要每天全天運行,因此長時間連接后,TCP連接斷開將是不可接受的。

您正在執行的操作效率低下,但並非如此。 在UNIX平台上,PostgreSQL的fork成本很低。 創建和銷毀后端相當便宜。

設置,身份驗證等確實需要時間,因此您將增加事務等待時間。

最好在應用程序內或像pgbouncer這樣的代理中使用連接池。 也就是說,對於“每分鍾幾十個連接”,除非您面臨負載問題,否則我不會太擔心。 這很丑,但還不錯。

TCP連接不只是在設置的一段時間后“掉線”。 除非您位於某些資源有限的有狀態NAT路由器或防火牆之后,否則它們可以無限期保持空閑狀態。 如果您只需要啟用TCP Keepalive。 沒有真正的理由不隨便打開連接。

無論如何, 您的應用程序應該已經具有連接丟失的重試邏輯,因為后端可能由於管理員操作,PostgreSQL服務器崩潰恢復和重新啟動,錯誤,服務器資源耗盡導致OOM等原因而死亡。永遠不要觸發並忘記事務。 您的應用程序應該記住從一開始就重做整個xact所需的完整狀態,直到它收到從數據庫提交的xact確認信息為止。 如果任何步驟出現故障,都應該能夠重新連接並重試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM