Почему HikariCP создает так много пустых соединений в postgresql - PullRequest
0 голосов
/ 08 мая 2018

У меня есть приложение JSP, работающее на glassfish5 с postgresql в качестве службы базы данных. Для управления подключениями я выбрал HikariCP, как показано ниже

 config.setDataSourceClassName("org.postgresql.ds.PGSimpleDataSource");
    config.addDataSourceProperty("serverName", host);
    config.addDataSourceProperty("portNumber", port);
    config.addDataSourceProperty("databaseName", database);
    config.addDataSourceProperty("user", username);
    config.addDataSourceProperty("password", password);
    config.addDataSourceProperty("assumeMinServerVersion", postrgesVersion);
    config.setMinimumIdle(100);
    config.setMaximumPoolSize(100);
    config.setAutoCommit(false);
    config.setIdleTimeout(3000);

    ds = new HikariDataSource(config);

и реализация с источником данных таким образом

  public static Connection getConnection() throws SQLException {
    return ds.getConnection();
}

когда я запускаю следующий запрос в pgAdmin

select datname,pid,usename,client_addr,client_port,backend_start,query,state from pg_stat_activity where datname = 'db_name' AND client_addr='10.1.0.56'

Я получаю следующие результаты со многими соединениями, в которых нет запросов, как показано на фотографии ниже

enter image description here

Через несколько секунд postgres жалуется на слишком большое количество соединений. Кто-нибудь когда-либо испытывал что-то подобное, пожалуйста, помогите.

1 Ответ

0 голосов
/ 08 мая 2018

setMinimumIdle(100) создаст 100 соединений при запуске, что является ненужным / плохой практикой.

Вы должны уменьшить число неиспользуемых соединений и максимальный размер пула в соответствии с Пул соединений Hikari увеличивается до максимального размера при запуске answer

Если у вас есть 3 активных узла (и 1 резервная копия), и в работе каждому узлу обычно требуется 5-6 подключений, возможно, установите для MaximumPoolSize значение 20, для параметра MaximumIdle - значение 2, а для параметра idleTimeout - значение примерно 2 минуты (120000 мс).

Так что в вашем случае измените две строки:

config.setMinimumIdle(2);
config.setMaximumPoolSize(20);
...