org.postgresql.util.PSQLException: FATAL: извините, слишком много клиентов уже - PullRequest
67 голосов
/ 03 мая 2010

Я пытаюсь подключиться к базе данных 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

Ответы [ 5 ]

130 голосов
/ 28 ноября 2012

Объяснение следующей ошибки:

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;

Стратегия отладки

  1. Вы можете дать разные имена пользователей / пароли программам, которые могут не освобождать соединения, чтобы выяснить, какое из них, и затем посмотреть в pg_stat_activity, чтобы выяснить, какое из них не очищает после себя.

  2. Выполните полную трассировку стека исключений, когда не удалось создать соединения, и следуйте по коду до того места, где вы создаете новый Connection, убедитесь, что каждая строка кода, в которой вы создаете соединение, заканчивается connection.close();

Как установить max_connections выше:

max_connections в postgresql.conf устанавливает максимальное количество одновременных подключений к серверу базы данных.

  1. Сначала найдите ваш файл postgresql.conf
  2. Если вы не знаете, где это, запросите базу данных с помощью sql: SHOW config_file;
  3. Шахта находится в: /var/lib/pgsql/data/postgresql.conf
  4. Войдите в систему как root и отредактируйте этот файл.
  5. Поиск строки: "max_connections".
  6. Вы увидите строку с надписью max_connections=100.
  7. Установите это число больше, проверьте лимит для вашей версии postgresql.
  8. Перезапустите базу данных postgresql, чтобы изменения вступили в силу.

Какой максимальный max_connections?

Используйте этот запрос:

select min_val, max_val from pg_settings where name='max_connections';

Я получаю значение 8388607, теоретически это самое большее, что вам разрешено иметь, но тогда безудержный процесс может съесть тысячи соединений, и, что удивительно, ваша база данных не отвечает до перезагрузки. Если бы у вас было разумное значение max_connections, например 100. Программа-нарушитель будет лишена нового соединения.

27 голосов
/ 03 мая 2010

Мы не знаем, что это за файл server.properties , мы также не знаем, что означает SimocoPoolSize (не так ли?)

Предположим, вы используете какой-то пользовательский пул соединений с базой данных. Тогда, я думаю, проблема в том, что ваш пул настроен на открытие 100 или 120 подключений, а ваш сервер Postgresql настроен на прием MaxConnections=90. Эти настройки кажутся противоречивыми. Попробуйте увеличить MaxConnections=120.

Но вы должны сначала понять инфраструктуру вашего уровня базы данных, знать, какой пул вы используете, если вам действительно нужно так много открытых соединений в пуле. И, особенно, если вы корректно возвращаете открытые соединения в пул

5 голосов
/ 04 февраля 2011

Нет необходимости увеличивать 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();
}
0 голосов
/ 24 января 2017

Вам необходимо закрыть все ваши подключения, например: Если вы делаете инструкцию INSERT INTO, вам необходимо закрыть инструкцию и вашу связь следующим образом:

statement.close();
Connexion.close():

И если вы делаете оператор SELECT, вам необходимо закрыть оператор, связь и набор результатов следующим образом:

resultset.close();
statement.close();
Connexion.close();

Я сделал это, и это сработало

0 голосов
/ 03 мая 2010

Обидные строки следующие:

MaxConnections=90
InitialConnections=80

Вы можете увеличить значения, чтобы разрешить больше подключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...