Org.postgresql.util.PSQLException: FATAL: извините, слишком много клиентов уже
Я пытаюсь подключиться к базе данных 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
Ответы
Ответ 1
Мы не знаем, что такое файл server.properties, мы не знаем, что означает SimocoPoolSize (вы?)
Предположим, вы используете какой-то пользовательский пул подключений к базе данных. Тогда, я думаю, проблема в том, что ваш пул настроен на открытие 100 или 120 подключений, но сервер Postgresql настроен на принятие MaxConnections=90
. Это противоречивые настройки. Попробуйте увеличить MaxConnections=120
.
Но сначала вы должны понять свою инфраструктуру уровня db, знать, какой пул вы используете, если вам действительно нужно так много открытых подключений в пуле. И, особенно, если вы изящно возвращаете открытые соединения с пулом
Ответ 2
Объяснение следующей ошибки:
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:
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. Программе оскорбления будет отказано в новом соединении.
Ответ 3
Не нужно увеличивать 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();
}
Ответ 4
Оскорбительные строки следующие:
MaxConnections=90
InitialConnections=80
Вы можете увеличить значения, чтобы больше подключений.
Ответ 5
Вам нужно закрыть все ваши подключения, например:
Если вы делаете инструкцию INSERT INTO, вам необходимо закрыть оператор и вашу связь таким образом:
statement.close();
Connexion.close():
И если вы сделаете инструкцию SELECT, вам нужно закрыть оператор, соединение и набор результатов следующим образом:
resultset.close();
statement.close();
Connexion.close();
Я сделал это, и он работал
Ответ 6
1. Проверьте текущую конфигурацию
Войдите в PostgreSQL с помощью команды psql,
postgres=# show max_connections;
max_connections
-----------------
100
(1 row)
2. Откройте конфигурационный файл PostgreSQL
vi /var/lib/pgsql/data/postgresql.conf
3. Измените следующие конфигурации по умолчанию
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