орг.postgresql.утиль.PSQLException: FATAL: извините, слишком много клиентов уже
Я пытаюсь подключиться к базе данных PostgreSQL, я получаю следующую ошибку:
ошибка: org.postgresql.утиль.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
6 ответов:
мы не знаем, что сервер.свойства файл это, мы ни знаем, что SimocoPoolSize значит (ты?)
предположим, вы используете какой-то пользовательский пул подключений к базе данных. Тогда, я думаю, проблема в том, что ваш пул настроен на открытие 100 или 120 соединений, но вы Postgresql server настроен на прием
MaxConnections=90. Эти настройки кажутся противоречивыми. Попробуйте увеличитьMaxConnections=120.но вы должны сначала понять вашей БД инфраструктура уровня, знайте, какой пул вы используете, если вам действительно нужно так много открытых соединений в пуле. И, особенно, если вы изящно возвращаете открытые соединения в пул
объяснение следующей ошибки:
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 max connections allowed:
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 file
- если вы не знаете, где он находится, запросите базу данных с помощью 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(); }
1. Проверьте текущую конфигурацию
войдите в PostgreSQL с помощью команды psql,
postgres=# show max_connections; max_connections ----------------- 100 (1 row)2. Откройте файл конфигурации PostgreSQL
vi /var/lib/pgsql/data/postgresql.conf3. Измените следующие конфигурации по умолчанию соответственно
max_connections = 100 # (change requires restart) # Note: Increasing max_connections costs ~400 bytes of shared memory per .... shared_buffers = 400MB # min 128kB # (change requires restart)4. Перезапустите сервер PostgreSQL, чтобы применить изменения
$:service postgresql restart Stopping postgresql service: [ OK ] Starting postgresql service: [ OK ]ссылка
http://www.devdummy.com/2017/10/postgresql-psqlexception-fatal-sorry.html
оскорбительные строки следующие:
MaxConnections=90 InitialConnections=80вы можете увеличить значения, чтобы позволить больше связей.
вам нужно закрыть все ваши связи, например: Если вы делаете INSERT INTO оператор, вам нужно закрыть оператор и ваше соединение следующим образом:
statement.close(); Connexion.close():и если вы делаете оператор SELECT, вам нужно закрыть оператор, соединение и результирующий набор следующим образом:
resultset.close(); statement.close(); Connexion.close();Я сделал это и он работал
Comments