PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

org.postgresql.util.PSQLException:FATAL:przepraszam, już za dużo klientów

Objaśnienie następującego błędu:

org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.

Podsumowanie:

Otworzyłeś więcej niż dozwolony limit połączeń z bazą danych. Uruchomiłeś coś takiego:Connection conn = myconn.Open(); wewnątrz pętli i zapomniałem uruchomić conn.close(); . Tylko dlatego, że twoja klasa jest zniszczona i zbierane śmieci nie zwalnia połączenia z bazą danych. Najszybszym rozwiązaniem tego problemu jest upewnienie się, że masz następujący kod z dowolną klasą, która tworzy połączenie:

protected void finalize() throws Throwable  
{  
    try { your_connection.close(); } 
    catch (SQLException e) { 
        e.printStackTrace();
    }
    super.finalize();  
}  

Umieść ten kod w dowolnej klasie, w której tworzysz połączenie. Następnie, gdy Twoja klasa zostanie zebrana, Twoje połączenie zostanie zwolnione.

Uruchom ten kod SQL, aby zobaczyć maksymalne dozwolone połączenia postgresql:

show max_connections;

Wartość domyślna to 100. PostgreSQL na dobrym sprzęcie może obsługiwać kilkaset połączeń na raz. Jeśli chcesz mieć tysiące, powinieneś rozważyć użycie oprogramowania do puli połączeń, aby zmniejszyć obciążenie połączenia.

Przyjrzyj się dokładnie, kto/co/kiedy/gdzie utrzymuje otwarte połączenia:

SELECT * FROM pg_stat_activity;

Liczba aktualnie używanych połączeń to:

SELECT COUNT(*) from pg_stat_activity;

Strategia debugowania

  1. Możesz nadać różne nazwy użytkownika/hasła programom, które mogą nie zwalniać połączeń, aby dowiedzieć się, który to jest, a następnie zajrzeć do pg_stat_activity, aby dowiedzieć się, które z nich nie sprząta po sobie.

  2. Wykonaj pełny ślad stosu wyjątków, gdy nie można utworzyć połączeń, i postępuj zgodnie z kodem, aż do miejsca, w którym utworzysz nowe Connection , upewnij się, że każda linia kodu, w której tworzysz połączenie, kończy się connection.close();

Jak ustawić wyższą wartość max_connections:

max_connections w postgresql.conf ustawia maksymalną liczbę jednoczesnych połączeń z serwerem bazy danych.

  1. Najpierw znajdź swój plik postgresql.conf
  2. Jeśli nie wiesz, gdzie to jest, zapytaj bazę danych za pomocą sql:SHOW config_file;
  3. Mój jest w:/var/lib/pgsql/data/postgresql.conf
  4. Zaloguj się jako root i edytuj ten plik.
  5. Wyszukaj ciąg:„max_connections”.
  6. Zobaczysz wiersz z napisem max_connections=100 .
  7. Ustaw tę liczbę na większą, sprawdź limit dla swojej wersji postgresql.
  8. Uruchom ponownie bazę danych postgresql, aby zmiany zaczęły obowiązywać.

Jaka jest maksymalna liczba połączeń?

Użyj tego zapytania:

select min_val, max_val from pg_settings where name='max_connections';

Otrzymuję wartość 8388607 , teoretycznie jest to maksimum, jakie możesz mieć, ale wtedy niekontrolowany proces może pochłonąć tysiące połączeń i zaskoczenie, Twoja baza danych nie odpowiada aż do ponownego uruchomienia. Gdybyś miał rozsądną liczbę max_connections, taką jak 100, nowe połączenie zostanie odrzucone programowi naruszającemu przepisy.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak połączyć się ze zdalną bazą danych PostgreSQL przez SSL za pomocą Pythona?

  2. Konfiguracja i użytkowanie pgmemcache

  3. Jak włączyć logowanie powolnych zapytań w PostgreSQL?

  4. Jak zminimalizować RPO dla baz danych PostgreSQL za pomocą odzyskiwania punktu w czasie?

  5. Zmienianie pola Enum za pomocą Alembic