Перейти к основному содержимому

HikariCP - Пул соединений с базой данных

Что это​

Создание новых соединений с базой данных требует определённых вычислительных затрат, особенно при наличии аутентификации.

Поэтому для повышения производительности целесообразно повторно использовать соединения, а не постоянно открывать новое.

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

Это даёт большой прирост производительности, а также позволяет задавать множество дополнительных параметров конфигурации, включая самый известный — ограничение максимального числа соединений, чтобы избежать перегрузки базы данных.

HikariCP​

Hikari означает «свет» по-японски; это самый эффективный и широко используемый пул в Java-приложениях, известный тем, что имеет, безусловно, лучшую производительность.

Официальный репозиторий HikariCP можно найти здесь на GitHub; ознакомьтесь с графиками производительности и информацией о конфигурациях.

Netuno использует HikariCP для управления соединениями с PostgreSQL, MariaDB, Microsoft SQL Server и Oracle.

Конфигурация​

Настройка HikariCP в Netuno выполняется вместе с настройкой базы данных в приложениях.

То есть внутри приложения в папке config в конфигурации окружения, например:

  • _development.json
  • _production.json

Раздел "db" содержит настройки базы данных.

Как для соединения default, так и для любого другого можно одинаковым образом настроить параметры HikariCP.

Так, внутри default, где указаны host, port, name (имя базы данных), username и password, достаточно добавить дополнительные параметры HikariCP, например:

...
"db": {
"default": {
"engine": "pg",
"host": "localhost",
"port": 5432,
"name": "моя_база",
"username": "мой_пользователь",
"password": "секрет",
"maximumPoolSize": 25,
"minimumIdle": 1,
"idleTimeout": 10000,
"maxLifetime": 60000
}
}
...

Например, каждая из этих дополнительных настроек HikariCP выше служит для следующего:

  • maximumPoolSize задаёт максимальный размер пула соединений в HikariCP; в этом примере предел соединений будет 25.
  • minimumIdle задаёт минимальное количество соединений, ожидающих в очереди на использование.
  • idleTimeout — это время, в течение которого соединение может оставаться в ожидании.
  • maxLifetime — это максимальное время жизни соединения.

Настройки HikariCP должны соответствовать конфигурации движка базы данных. Например, максимальное количество соединений и предельные значения времени никогда не должны превышать то, что определено в движке базы данных.

Любой другой параметр HikariCP можно настроить таким же образом — достаточно добавить нужные параметры конфигурации.

Параметры​

Ниже приведён список параметров, которые Netuno позволяет настраивать для HikariCP.

Любой другой параметр конфигурации HikariCP либо предопределён Netuno автоматически, либо не применим.

Часто используемые​

autoCommit​

Это свойство управляет поведением автоматической фиксации по умолчанию для соединений, возвращаемых из пула. Значение логическое.

По умолчанию: true

connectionTimeout​

Это свойство управляет максимальным временем в миллисекундах, в течение которого клиент (то есть вы) будет ожидать соединение из пула. Если это время истечёт, а соединение не станет доступным, будет выброшено SQLException. Наименьшее допустимое время ожидания соединения — 250 мс.

По умолчанию: 30000 (30 секунд)

idleTimeout​

Это свойство управляет максимальным временем, в течение которого соединению разрешено простаивать в пуле. Эта настройка применяется только тогда, когда minimumIdle задано меньше maximumPoolSize. Простаивающие соединения не будут удаляться, когда пул достигнет minimumIdle соединений. Будет ли соединение удалено как неактивное, зависит от максимального отклонения +30 секунд и среднего отклонения +15 секунд. Соединение никогда не будет удалено как простаивающее раньше этого времени ожидания. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула. Минимально допустимое значение — 10000 мс (10 секунд).

По умолчанию: 600000 (10 минут)

maxLifetime​

Это свойство управляет максимальным сроком жизни соединения в пуле. Используемое соединение никогда не будет удалено; оно будет удалено только после закрытия. Для каждого соединения применяется небольшое отрицательное смещение, чтобы избежать массового удаления из пула. Мы настоятельно рекомендуем задавать это значение, и оно должно быть на несколько секунд короче любого ограничения времени соединения, установленного базой данных или инфраструктурой. Значение 0 означает максимальный срок жизни (бесконечную длительность), разумеется, с учётом настройки idleTimeout. Минимально допустимое значение — 30000 мс (30 секунд).

По умолчанию: 1800000 (30 минут)

minimumIdle​

Это свойство управляет минимальным количеством простаивающих соединений, которые HikariCP старается поддерживать в пуле. Если количество простаивающих соединений опускается ниже этого значения, а общее количество соединений в пуле меньше maximumPoolSize, HikariCP прилагает максимум усилий, чтобы быстро и эффективно добавить дополнительные соединения. Однако для максимальной производительности и отзывчивости при пиковых нагрузках мы рекомендуем не задавать это значение, а вместо этого позволить HikariCP работать как пулу соединений фиксированного размера.

По умолчанию: такой же, как размер maximumPoolSize

maximumPoolSize​

Это свойство управляет максимальным размером, которого может достигать пул, включая как простаивающие, так и используемые соединения. По сути, это значение определяет максимальное количество реальных соединений с серверной частью базы данных. Разумное значение для этого лучше всего определяется вашей средой выполнения. Когда пул достигает этого размера и нет доступных простаивающих соединений, вызовы getConnection() будут блокироваться до истечения connectionTimeout миллисекунд.

По умолчанию: 10

Используемые реже​

initializationFailTimeout​

Это свойство управляет тем, будет ли пул «быстро завершаться с ошибкой», если пул не может быть успешно инициализирован начальным соединением. Любое положительное число рассматривается как количество миллисекунд для попытки получить начальное соединение; поток приложения будет заблокирован на этот период. Если соединение не удаётся получить до истечения этого интервала, будет выброшено исключение. Это время ожидания применяется после периода connectionTimeout. Если значение равно нулю (0), HikariCP попытается получить и проверить соединение. Если соединение получено, но не прошло проверку, будет выброшено исключение, и пул не будет запущен. Однако если получить соединение не удаётся, пул запустится, но последующие попытки получить соединение могут завершиться ошибкой. Значение меньше нуля обходит любую начальную попытку соединения, и пул запускается немедленно, пытаясь получить соединения в фоновом режиме. Следовательно, последующие попытки получить соединение могут завершиться ошибкой.

По умолчанию: 1

catalog​

Это свойство задаёт каталог по умолчанию для баз данных, поддерживающих концепцию каталогов. Если это свойство не указано, используется каталог по умолчанию, определённый драйвером JDBC.

По умолчанию: по умолчанию драйвера

validationTimeout​

Это свойство управляет максимальным периодом времени, в течение которого соединение будет проверяться на работоспособность. Это значение должно быть меньше connectionTimeout. Наименьшее допустимое время ожидания проверки — 250 мс.

По умолчанию: 5000

leakDetectionThreshold​

Это свойство управляет количеством времени, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее допустимое значение для включения обнаружения утечек — 2000 (2 секунды).

По умолчанию: 0

schema​

Это свойство задаёт схему по умолчанию для баз данных, поддерживающих концепцию схем. Если это свойство не указано, используется схема по умолчанию, определённая драйвером JDBC.

По умолчанию: по умолчанию драйвера

DataSource​

Также можно добавлять настройки в DataSource, то есть дополнительные настройки, специфичные для используемого типа базы данных.

Для выполнения этой более продвинутой настройки необходимо добавить объект конфигурации datasource внутрь объекта конфигурации соединения с базой данных.

Например, так:

...
"db": {
"default": {
"engine": "mariadb",
"host": "localhost",
"port": 3306,
"name": "моя_база",
"username": "мой_пользователь",
"password": "секрет",
"maximumPoolSize": 25,
"minimumIdle": 1,
"idleTimeout": 10000,
"maxLifetime": 60000,
"datasource": {
"cachePrepStmts": "true",
"prepStmtCacheSize": 250,
"prepStmtCacheSqlLimit": 2048
}
}
}
...

Обратите внимание, что значения настроек параметров DataSource имеют тип string; в любом случае Netuno всегда автоматически преобразует их в string.

Заключение​

С использованием HikariCP можно выполнять продвинутые настройки для управления нагрузкой и поведением соединений с базой данных.

Его можно оптимизировать для самых разных сценариев, обеспечивая высокую производительность.