Много соединений, так как сон вызывает слишком много ошибок соединений

Я реализовал Hikari Connection Pooling.

Это моя конфигурация для пула.

        config.setUsername("abc");
        config.setPassword("abc");
        config.addDataSourceProperty("maximumPoolSize", "10");
        config.addDataSourceProperty("maxLifetime", "60");
        config.addDataSourceProperty("cachePrepStmts", "true");
        config.addDataSourceProperty("prepStmtCacheSize", "250");
        config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        ds = new HikariDataSource(config);

Проблема в том, что есть много и много (около 150) соединений под command как спящий, когда я выполняю show processlist.

Это вызывает проблему «слишком много подключений».

У меня есть два веб-приложения, которые подключаются к этой базе данных, но даже если я их отменяю, то есть нет веб-приложений, пытающихся подключиться к базе данных, я все равно вижу, что количество разрешенных подключений равно измученный.

Я тщательно рассмотрел подобные вопросы на SO, никто мне не помогает.


person driftking9987    schedule 29.05.2017    source источник
comment
Строго с точки зрения общего устранения неполадок высокого уровня ваше приложение может SELECT CONNECTION_ID() и регистрировать значение, которое соответствует Id, показанному в списке процессов, чтобы помочь вам понять, как работает (или не работает) объединение. Я подозреваю, что ваш код пропускает соединения, что объясняет это. Может быть, что-то вроде config.setLeakDetectionThreshold(20000); вызовет их.   -  person Michael - sqlbot    schedule 29.05.2017
comment
Кроме того, maximumPoolSize следует установить через config.setMaximumPoolSize(10). А maxLifetime надо ставить через config.setMaxLifetime(60 * 60 * 1000) (на один час). Все значения времени и времени ожидания HikariCP указаны в миллисекундах. В качестве побочного узла maxLifetime в 60 секунд было бы контрпродуктивно; Я не рекомендую любое значение менее 5 минут. Если вы хотите более быстрый выход на пенсию и пул минимального размера, используйте minimumIdle и idleTimeout.   -  person brettw    schedule 29.05.2017
comment
Включите ведение журнала уровня DEBUG для com.zaxxer.hikari. Похоже, вы создаете множество пулов, каждый из которых создаст 10 подключений. Ведение журнала отладки покажет, так ли это.   -  person brettw    schedule 29.05.2017
comment
я почти уверен, что использовал соединение как синглтон, то есть один для всего проекта. Что я понял, так это то, что когда я удалил приложение из tomcat, соединения не закрывались (не знаю почему?), поэтому я добавил HikariDataSource.close в метод уничтожения сервлета. Хороший ли это подход?   -  person driftking9987    schedule 30.05.2017
comment
@driftking9987 driftking9987 Сервлет — неподходящее место для управления жизненным циклом. Вы должны реализовать ServletContextListener, аналогичный описанному в этом ответе: stackoverflow.com/questions/5407525/. Если вы не используете JNDI, метод contextInitialized() будет хорошим местом для инициализации базы данных, а уничтожение, очевидно, будет в методе contextDestroyed().   -  person brettw    schedule 30.05.2017