Медленный HikariDataSource.getConnection () на медленном на малом трафике, быстрый на большом трафике - PullRequest
0 голосов
/ 08 октября 2019

Привет, у меня странная проблема, я использую Oracle db и имею miroservice с простой конечной точкой, которая имеет только getById, который очень быстр 3-15 мс, но вся операция заняла 250 мс. Я погрузился в наши инструменты мониторинга производительности и увидел, что мы тратим более 200 мс на com.zaxxer.hikari.HikariDataSource.getConnection ().

Затем я выполняю 2000 запросов к этой конечной точке в течение 10 минут и время сокращается до1,3 мс. Что происходит? При наличии 5 запросов в час для соединения требуется 200 с, но при наличии 4 в секунду 1.3.?

Есть ли ошибки в конфигурации

spring:
 datasource:
    connectionTimeout: 10000
    maxLifetime: 18000000
    maximumPoolSize: 5
    cachePrepStmts: true
    prepStmtCacheSize: 250
    prepStmtCacheSqlLimit: 2048
    useServerPrepStmts: true

Редактировать: Как я понимаю, если у нас большой период без обращения к БД, эти физические соединения с БД, обернутые из Хикари, закрыты. Нужно ли устанавливать MinimumIdle и idleTimeout ? Если у меня неактивность 2 часа, все соединения будут закончены через maxLifetime, и будет создано новое соединение? Нет необходимости в минимальном простое, верно? Пример: Пусть иметь

minimumIdle 1
idleTimeout 2 minutes
maxLifeTime 20 minutes

Когда мое приложение остается без присмотра в течение ночи, я ожидаю, что Hikari закроет каждое соединение через 2 минуты после последнего запроса соединения, после последнего соединениябудучи закрытым, создайте новое (и удерживайте его в пуле), а затем закрывайте и заново создавайте это свободное соединение каждые 20 минут. Я правильно понял? И это решение моей проблемы?

Пополнение пула происходит каждые 30 секунд или около того. Таким образом, если имеется 5 незанятых соединений, и приходит запрос и использует одно из них, оставляя 4 незанятых, если запрос завершается и соединение возвращается до «пополнения», пул снова будет иметь 5 незанятых соединений и не будет расти.

Ссылка: [Понимание поведения пула соединений HikariCP] enter image description here

1 Ответ

0 голосов
/ 09 октября 2019

Вы можете установить idleTimeout , если для параметра minimalIdle задано значение, меньшее чем MaximumPoolSize

⌚idleTimeout. Это свойство контролирует максимальное количество времени, в течение которого соединению разрешено находиться в режиме ожидания. бассейн. Этот параметр применяется только в том случае, если для параметра minimalIdle задано значение меньше, чем MaximumPoolSize. Свободные соединения не будут удалены, когда пул достигнет минимальных незанятых соединений.

...