Vysvětlení následující chyby:
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.
Shrnutí:
Otevřeli jste více než povolený limit připojení k databázi. Spustili jste něco takového:Connection conn = myconn.Open();
uvnitř smyčky a zapomněli jste spustit conn.close();
. Jen proto, že je vaše třída zničena a shromážděné odpadky, neuvolní připojení k databázi. Nejrychlejší opravou je ujistit se, že máte následující kód s jakoukoli třídou, která vytváří připojení:
protected void finalize() throws Throwable
{
try { your_connection.close(); }
catch (SQLException e) {
e.printStackTrace();
}
super.finalize();
}
Umístěte tento kód do libovolné třídy, kde vytváříte připojení. Když se pak ve vaší třídě posbírají odpadky, vaše připojení bude uvolněno.
Spuštěním tohoto SQL zobrazíte maximální povolená připojení postgresql:
show max_connections;
Výchozí hodnota je 100. PostgreSQL na dobrém hardwaru může podporovat několik stovek připojení najednou. Pokud chcete mít tisíce, měli byste zvážit použití softwaru pro sdružování připojení, abyste snížili režii připojení.
Podívejte se přesně na to, kdo/co/kdy/kde drží vaše spojení otevřená:
SELECT * FROM pg_stat_activity;
Počet aktuálně používaných připojení je:
SELECT COUNT(*) from pg_stat_activity;
Strategie ladění
-
Můžete dát různá uživatelská jména/hesla programům, které možná neuvolňují připojení, abyste zjistili, které to je, a pak se podívejte do pg_stat_activity, abyste zjistili, které z nich po sobě nečistí.
-
Proveďte úplné trasování zásobníku výjimek, když připojení nebylo možné vytvořit, a postupujte podle kódu zpět tam, kde vytvoříte nové
Connection
, ujistěte se, že každý řádek kódu, kde vytváříte připojení, končí znakemconnection.close();
Jak nastavit vyšší hodnotu max_connections:
max_connections v souboru postgresql.conf nastavuje maximální počet souběžných připojení k databázovému serveru.
- Nejprve najděte svůj soubor postgresql.conf
- Pokud nevíte, kde to je, zeptejte se databáze pomocí sql:
SHOW config_file;
- Moje je v:
/var/lib/pgsql/data/postgresql.conf
- Přihlaste se jako root a upravte tento soubor.
- Vyhledejte řetězec:"max_connections".
- Uvidíte řádek, který říká
max_connections=100
. - Nastavte toto číslo větší, zkontrolujte limit pro svou verzi postgresql.
- Restartujte databázi postgresql, aby se změny projevily.
Jaký je maximální max_connections?
Použijte tento dotaz:
select min_val, max_val from pg_settings where name='max_connections';
Dostanu hodnotu 8388607
, teoreticky je to nejvíc, co smíte mít, ale pak může nekontrolovaný proces sníst tisíce připojení a překvapivě vaše databáze nereaguje až do restartu. Pokud byste měli rozumný max_connections jako 100. Problémovému programu by bylo odepřeno nové připojení.