org.postgresql.util.PSQLException: FATAL: вибачте, вже занадто багато клієнтів


93

Я намагаюся підключитися до бази даних Postgresql, я отримую таку помилку:

Помилка: org.postgresql.util.PSQLException: FATAL: вибачте, вже занадто багато клієнтів

Що означає помилка і як її виправити?

Мій server.propertiesфайл такий:

serverPortData=9042
serverPortCommand=9078
trackConnectionURL=jdbc:postgresql://127.0.0.1:5432/vTrack?user=postgres password=postgres
dst=1
DatabaseName=vTrack
ServerName=127.0.0.1
User=postgres
Password=admin
MaxConnections=90
InitialConnections=80
PoolSize=100
MaxPoolSize=100
KeepAliveTime=100
TrackPoolSize=120
TrackMaxPoolSize=120
TrackKeepAliveTime=100
PortNumber=5432
Logging=1

Відповіді:


39

Ми не знаємо, що це за файл server.properties , ми також не знаємо, що означає SimocoPoolSize (ви?)

Припустимо, ви використовуєте певний власний пул підключень до бази даних. Тоді, я думаю, проблема полягає в тому, що ваш пул налаштований на відкриття 100 або 120 підключень, але ви, сервер Postgresql, налаштований на прийняття MaxConnections=90. Це здаються суперечливими налаштуваннями. Спробуйте збільшити MaxConnections=120.

Але спочатку слід зрозуміти свою інфраструктуру рівня db, знати, який пул ви використовуєте, якщо вам справді потрібно стільки відкритих з'єднань у пулі. І, особливо, якщо ви витончено повертаєте відкриті з'єднання до басейну


169

Пояснення такої помилки:

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;

Стратегія налагодження

  1. Ви можете надати різні імена користувачів / паролі програмам, які, можливо, не звільняють з’єднання, щоб з’ясувати, яке саме це, а потім заглянути в pg_stat_activity, щоб з’ясувати, яке саме не очищає після себе.

  2. Виконайте повну трасування стека винятків, коли не вдалося створити з'єднання, і перейдіть за кодом назад до місця, де ви створюєте нове Connection, переконайтесь, що кожен рядок коду, де ви створюєте з'єднання, закінчуєтьсяconnection.close();

Як встановити max_connections вище:

max_connections у postgresql.conf встановлює максимальну кількість одночасних з'єднань із сервером бази даних.

  1. Спочатку знайдіть файл postgresql.conf
  2. Якщо ви не знаєте, де вона знаходиться, запитайте базу даних за допомогою sql: SHOW config_file;
  3. Шахта знаходиться в: /var/lib/pgsql/data/postgresql.conf
  4. Увійдіть як root і відредагуйте цей файл.
  5. Шукайте рядок: "max_connections".
  6. Ви побачите рядок із написом max_connections=100.
  7. Встановіть це число більше, перевірте ліміт для вашої версії postgresql.
  8. Перезапустіть базу даних postgresql, щоб зміни набрали чинності.

Який максимум max_connections?

Використовуйте цей запит:

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

Я розумію цінність 8388607, теоретично це найбільше, що вам дозволено, але тоді невтішний процес може з’їсти тисячі з’єднань, і дивно, ваша база даних не реагує до перезавантаження. Якби у вас були розумні max_connections на зразок 100. Програмі, що порушує, буде відмовлено в новому підключенні.


4
чому деякі люди забувають символ ';' після операторів SQL ?!
Копіює

@codervince Ви повинні звернути увагу. Я б майже зайшов так далеко, сказавши, що вам слід транскрибувати команди, а не copy + paste.
AVProgrammer

4

Не потрібно збільшувати MaxConnections & InitialConnections. Просто закрийте свої зв’язки після того, як зробите свою роботу. Наприклад, якщо ви створюєте з'єднання:

try {
     connection = DriverManager.getConnection(
                    "jdbc:postgresql://127.0.0.1/"+dbname,user,pass);

   } catch (SQLException e) {
    e.printStackTrace();
    return;
}

Після вашої роботи тісний зв’язок:

try {
    connection.commit();
    connection.close();
} catch (SQLException e) {
    e.printStackTrace();
}

11
Завжди тісні зв’язки в блоці нарешті! В іншому випадку підключення залишається відкритим, якщо виникає помилка.
tine2k

1

Наступні рядки:

MaxConnections=90
InitialConnections=80

Ви можете збільшити значення, щоб дозволити більше з'єднань.


4
І якщо у вас буде більше з’єднань, дозвольте також налаштувати параметри пам’яті, щоб вирівняти збільшені з’єднання.
Куберхаун

0

Вам потрібно закрити всі ваші з'єднання, наприклад: Якщо ви робите оператор INSERT INTO, вам потрібно закрити оператор і ваше з'єднання таким чином:

statement.close();
Connexion.close():

І якщо ви робите оператор SELECT, вам потрібно закрити оператор, підключення та набір результатів таким чином:

resultset.close();
statement.close();
Connexion.close();

Я зробив це, і це спрацювало

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.