簡體   English   中英

Heroku "psql: FATAL: 剩余的連接槽保留給非復制超級用戶連接"

[英]Heroku "psql: FATAL: remaining connection slots are reserved for non-replication superuser connections"

我正在 Heroku 上開發一個應用程序,后端為 Postgresql。 在嘗試訪問數據庫時,我會定期從 CLI 和在服務器上加載頁面時收到此錯誤消息:

psql: FATAL: remaining connection slots are reserved for non-replication superuser connections

有人以前見過這個,或者請幫我指出正確的方向嗎?

您要么需要增加max_connections配置設置,要么(可能更好) 使用連接池通過較小的連接池路由大量用戶請求。

https://wiki.postgresql.org/wiki/Number_Of_Database_Connections

當我忘記關閉連接時發生此異常

請參閱Heroku “psql: FATAL: 剩余連接槽為非復制超級用戶連接保留”

Heroku 有時會遇到數據庫負載平衡問題。

André Laszlomarkshiz和我都在對這個問題的評論中報告了處理這個問題。

為了節省您的支持電話,以下是我從 Heroku 支持部門收到的針對類似問題的回復:

你好,

愛好層數據庫的限制之一是不通知的維護。 許多愛好數據庫運行在單個共享服務器上,我們偶爾需要重新啟動該服務器以進行硬件維護,或者將數據庫遷移到另一台服務器以進行負載平衡。 發生這種情況時,您會在日志中看到錯誤或連接出現問題。 如果服務器正在重新啟動,則數據庫可能需要 15 分鍾或更長時間才能重新聯機。

大多數維護連接池的應用程序(如 Rails 中的 ActiveRecord)只能打開一個到數據庫的新連接。 但是,在某些情況下,應用程序將無法重新連接。 如果發生這種情況,您可以 heroku 重新啟動您的應用程序以使其重新上線。

這是我們建議不要為關鍵生產應用程序運行愛好數據庫的原因之一。 標准和高級數據庫包括停機事件通知,並且通常性能更高且更穩定。 您可以使用 pg:copy 遷移到標准或高級計划。

如果這種情況繼續存在,您可以嘗試使用 heroku addons:add 配置一個新數據庫(在不同的服務器上),然后使用 pg:copy 移動數據。 請記住,愛好等級規則適用於 9 美元的基本計划以及免費數據庫。

謝謝,布拉德利

我實際上嘗試使用以下方法在 django 端實現連接池:

https://github.com/gmcguire/django-db-pool

但我仍然收到此錯誤,盡管將可用連接數降低到低於 20 個打開連接的標准開發數據庫配額。

這里有一篇關於如何將您的 postgresql 數據庫移動到 Amazon RDS 的免費/廉價層的文章。 這將允許您將max_connections設置得更高。 這也將允許您使用 PGBouncer 在數據庫級別建立連接池。

https://www.lewagon.com/blog/how-to-migrate-heroku-postgres-database-to-amazon-rds

更新:

Heroku 回應了我的開放請求,並表示我的數據庫在他們的網絡中負載平衡不當。 他們說對他們的系統的改進應該可以防止將來出現類似的問題。 盡管如此,支持手動重新定位我的數據庫並且性能顯着提高。

按照以下命令重新啟動postgres數據庫:

postgres -D /usr/local/var/postgres

在 Linux 中重現相同的問題:

for i in {1..300}; do
     PGPASSWORD=MY_PASSWORD gnome-terminal -e  $'/usr/bin/psql -h \'127.0.0.1\' -p 5432 -U MY_USERNAME' 
done

在 dotnet 客戶端中,您可以閱讀:

 System.InvalidOperationException: An exception has been raised that is likely due to a transient failure. ---> Npgsql.PostgresException (0x80004005): 53300: sorry, too many clients already

在我的案例中有很多空閑連接,所以我必須在創建新連接之前重用空閑連接,

錯誤消息意味着該應用程序已用完所有可用連接。

在帶有 knex 和 typescript 的 aws 中使用 postgres 執行一些查詢和更新作業時,當它完成 390 個數據庫操作時會彈出問題,為此錯誤會阻止正常的 knex.destroy() 操作。 錯誤信息是:

(節點:66236)UnhandledPromiseRejectionWarning:錯誤:剩余的連接槽保留用於非復制超級用戶連接

當 knex.destroy() 到達正確的位置時,錯誤就消失了。

.NET世界的背景下,似乎沒有問題問這個問題。

對我來說,這是由async void引起的,此方法傳遞給 Action 委托Action<TMessage> action ,並且有多個線程試圖同時調用此 Persist 方法。

private async void Persist(WhateverData data)
{
    await _repository.InsertAsync(data);
}

解決方案是,刪除 async 和 await,並同步使用它

private void Persist(PriceInfo price)
{
    _repository.InsertAsync().WaitAndUnwrapException();
}

設置 tomcat-jdbc 的最大活動大小,在您的 .properties 或 .yml 文件中設置此屬性:

spring.datasource.maxActive=5

要么

spring.datasource.max-active=5

如下:

spring:數據源:driverClassName:密碼:url:用戶名:max-active:5

暫無
暫無

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

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