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