Медленный HikariDataSource.getConnection () при медленном при низком трафике, быстро при большом трафике

Привет, у меня есть эта странная проблема, я использую 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

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

minimumIdle 1
idleTimeout 2 minutes
maxLifeTime 20 minutes

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

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

Ссылка: [Общие сведения о поведении пула подключений HikariCP]   введите описание изображения здесь


person Xelian    schedule 08.10.2019    source источник
comment
Тайм-аут соединений, особенно когда они простаивают. Поэтому, когда трафика мало / нет, вы можете столкнуться с устаревшими соединениями. Если у вас есть пул из 5, это может означать 5 подключений, пока не будет создано новое. Также, если это последняя версия Spring, вы используете неправильные свойства. Вы должны использовать проверку соединений в режиме ожидания (и установить минимальное и максимальное значение для вашего пула). Таким образом, неактивные соединения будут активно очищаться вместо ожидания проверки при извлечении из пула.   -  person M. Deinum    schedule 08.10.2019
comment
@ M.Deinum есть ли способ сохранить эти связи и предотвратить их бездействие? Как выполнить select (1) или какой-нибудь трюк? Какое свойство HikariCP использовать для вас, вы должны использовать проверку соединений в режиме ожидания (и установить минимальное и максимальное значение для вашего пула)   -  person Xelian    schedule 08.10.2019
comment
Я предлагаю справочное руководство по весенней загрузке. Свойства Hikari spring.datasource.hikari зависят от поставщика (если вы не используете очень старую версию Spring Boot).   -  person M. Deinum    schedule 09.10.2019


Ответы (1)


Вы можете установить idleTimeout, когда значение minimumIdle меньше maximumPoolSize

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

person user7294900    schedule 09.10.2019