Объяснение следующей ошибки:
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. Программа-нарушитель будет лишена нового соединения.