![](/img/trans.png)
[英]psql: FATAL: remaining connection slots are reserved for non-replication superuser connections
[英]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é Laszlo
、 markshiz
和我都在對這個問題的評論中報告了處理這個問題。
為了節省您的支持電話,以下是我從 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.