Wyjaś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łeś uruchomić conn.close();
. Tylko dlatego, że twoja klasa została zniszczona i zebrane elementy bezużyteczne, nie zwalniają połączenia z bazą danych. Najszybszym rozwiązaniem 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 jest zbierana jako śmieci, twoje połączenie zostanie zwolnione.
Uruchom ten kod SQL, aby zobaczyć dozwolone maksymalne połączenia postgresql:
show max_connections;
Wartością domyślną jest 100. PostgreSQL na dobrym sprzęcie może obsługiwać kilkaset połączeń naraz. Jeśli chcesz mieć tysiące, powinieneś rozważyć użycie oprogramowania do buforowania 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
Możesz podać 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óry z nich nie jest czyszczony po sobie.
Wykonaj pełny ślad stosu wyjątków, gdy nie można było utworzyć połączeń, i postępuj zgodnie z kodem z powrotem do miejsca, w którym tworzysz nowy Connection
, upewnij się, że każda linia kodu, w której tworzysz połączenie, kończy się znakiemconnection.close();
Jak ustawić wyższą wartość max_connections:
max_connections w postgresql.conf ustawia maksymalną liczbę jednoczesnych połączeń z serwerem bazy danych.
- Najpierw znajdź swój plik postgresql.conf
- Jeśli nie wiesz, gdzie to jest, wyślij zapytanie do bazy danych za pomocą polecenia sql:
SHOW config_file;
- Mój jest w:
/var/lib/pgsql/data/postgresql.conf
- Zaloguj się jako root i edytuj ten plik.
- Wyszukaj ciąg: „max_connections”.
- Zobaczysz wiersz, który mówi
max_connections=100
.
- Ustaw większą liczbę, sprawdź limit wersji postgresql.
- Uruchom ponownie bazę danych postgresql, aby zmiany odniosły skutek.
Jaka jest maksymalna maksymalna liczba połączeń?
Użyj tego zapytania:
select min_val, max_val from pg_settings where name='max_connections';
Rozumiem wartość 8388607
, teoretycznie to najwięcej, co możesz mieć, ale wtedy niekontrolowany proces może pochłonąć tysiące połączeń i, niespodzianka, twoja baza danych nie odpowiada do ponownego uruchomienia. Gdybyś miał rozsądne max_connections, takie jak 100. Obrażający program nie uzyskałby nowego połączenia.
Nie ma potrzeby zwiększania MaxConnections i InitialConnections. Po zakończeniu pracy zamknij połączenia. Na przykład, jeśli tworzysz połączenie:
try { connection = DriverManager.getConnection( "jdbc:postgresql://127.0.0.1/"+dbname,user,pass); } catch (SQLException e) { e.printStackTrace(); return; }
Po wykonaniu pracy zamknij połączenie:
try { connection.commit(); connection.close(); } catch (SQLException e) { e.printStackTrace(); }
źródło
Obraźliwe linie są następujące:
MaxConnections=90 InitialConnections=80
Możesz zwiększyć wartości, aby umożliwić więcej połączeń.
źródło
Musisz zamknąć wszystkie swoje połączenia, na przykład: Jeśli wykonujesz instrukcję INSERT INTO, musisz zamknąć instrukcję i połączenie w ten sposób:
statement.close(); Connexion.close():
A jeśli wykonasz instrukcję SELECT, musisz zamknąć instrukcję, połączenie i zestaw wyników w ten sposób:
resultset.close(); statement.close(); Connexion.close();
Zrobiłem to i zadziałało
źródło