Обяснение на следната грешка:
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.
Резюме:
Отворихте повече от позволеното ограничение за връзки към базата данни. Изпълнихте нещо подобно:Connection conn = myconn.Open();
вътре в цикъл и забравихте да изпълните conn.close();
. Само защото вашият клас е унищожен и събирането на боклука не освобождава връзката с базата данни. Най-бързото решение за това е да се уверите, че имате следния код с всеки клас, който създава връзка:
protected void finalize() throws Throwable
{
try { your_connection.close(); }
catch (SQLException e) {
e.printStackTrace();
}
super.finalize();
}
Поставете този код във всеки клас, където създавате връзка. След това, когато класът ви бъде събиран, връзката ви ще бъде освободена.
Изпълнете този SQL, за да видите максимално позволени postgresql връзки:
show max_connections;
По подразбиране е 100. PostgreSQL на добър хардуер може да поддържа няколкостотин връзки наведнъж. Ако искате да имате хиляди, трябва да помислите за използването на софтуер за обединяване на връзки, за да намалите разходите за свързване.
Разгледайте точно кой/какво/кога/къде държи връзките ви отворени:
SELECT * FROM pg_stat_activity;
Броят на използваните в момента връзки е:
SELECT COUNT(*) from pg_stat_activity;
Стратегия за отстраняване на грешки
-
Можете да дадете различни потребителски имена/пароли на програмите, които може да не освобождават връзките, за да разберете коя е, и след това да погледнете в pg_stat_activity, за да разберете коя от тях не почиства след себе си.
-
Направете пълно проследяване на стека на изключения, когато връзките не могат да бъдат създадени и следвайте кода обратно до мястото, където създавате нова
Connection
, уверете се, че всеки ред с код, където създавате връзка, завършва сconnection.close();
Как да настроите max_connections по-високо:
max_connections в postgresql.conf задава максималния брой едновременни връзки към сървъра на базата данни.
- Първо намерете вашия postgresql.conf файл
- Ако не знаете къде се намира, потърсете базата данни с sql:
SHOW config_file;
- Моят е в:
/var/lib/pgsql/data/postgresql.conf
- Влезте като root и редактирайте този файл.
- Търсете низа:"max_connections".
- Ще видите ред, който казва
max_connections=100
. - Задайте това число по-голямо, проверете лимита за вашата версия на postgresql.
- Рестартирайте базата данни postgresql, за да влязат в сила промените.
Какъв е максималният max_connections?
Използвайте тази заявка:
select min_val, max_val from pg_settings where name='max_connections';
Получавам стойността 8388607
, на теория това е най-многото, което ви е позволено да имате, но след това един бегъл процес може да изяде хиляди връзки и изненада, че вашата база данни не реагира до рестартиране. Ако имахте разумно max_connections като 100. На нарушителната програма щеше да бъде отказано нова връзка.