Пояснення такої помилки:
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. Програмі, що порушує, буде відмовлено в новому підключенні.