Объяснение следующей ошибки:
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. Программа-нарушитель не могла бы установить новое соединение.
Нет необходимости увеличивать 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(); }
источник
Оскорбительные строки следующие:
MaxConnections=90 InitialConnections=80
Вы можете увеличить значения, чтобы разрешить больше подключений.
источник
Например, вам нужно закрыть все ваши соединения: если вы делаете оператор INSERT INTO, вам нужно закрыть оператор и ваше соединение следующим образом:
statement.close(); Connexion.close():
И если вы сделаете оператор SELECT, вам нужно закрыть оператор, соединение и набор результатов следующим образом:
resultset.close(); statement.close(); Connexion.close();
Я сделал это, и это сработало
источник