Какой пул соединений (Connection Pool) выберет Spring Boot, если в classpath есть и кастомный, и стандартный (HikariCP)?

Ответ

Spring Boot использует четкий алгоритм выбора источника данных (DataSource), который определяет, какой пул соединений будет использован.

Порядок приоритета (от высшего к низшему):

  1. Явное указание в конфигурации: Если в свойствах (например, application.properties) задан spring.datasource.type, будет использован именно этот класс.
    spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
  2. Наличие кастомного пула в classpath: Если в зависимостях проекта есть библиотека пула соединений (например, Tomcat JDBC, Commons DBCP2), Spring Boot отдаст приоритет ей, а не HikariCP.
  3. Стандартный выбор (по умолчанию): Если ни одно из условий выше не выполнено, Spring Boot автоматически настраивает HikariCP, при условии, что он находится в classpath (что верно для spring-boot-starter-data-jpa или spring-boot-starter-jdbc).

Практический вывод: При добавлении зависимости кастомного пула (например, tomcat-jdbc) он будет выбран автоматически. Чтобы гарантированно использовать HikariCP, нужно либо исключить другие пулы, либо явно указать spring.datasource.type=com.zaxxer.hikari.HikariDataSource.

Ответ 18+ 🔞

Ну ты смотри, какая заковыристая история с этими базами данных в Спринге! Как будто на базаре стоят три продавца с одним и тем же товаром, и ты такой: "Кому из вас платить?" А Спринг Бут — он как главный закупщик, у него в голове чёткий план, кого слушать.

Вот смотри, как он решает, какую банку с соединениями (этот твой DataSource) тебе подсунуть:

Кто главнее в этой очереди (от самого наглого к самому скромному):

  1. Твой прямой приказ. Если ты в своём application.properties написал, как отче наш: "Хочу именно эту банку!", то всё, вопрос закрыт. Ты босс.

    spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource

    Сказал "томкат" — получил томкат, даже если у тебя в кармане лежит три других пула. Твоя воля, ёпта.

  2. Кто громче крикнул "я тут!". Если ты в проект (в pom.xml или build.gradle) засунул какую-нибудь левую библиотеку с пулом соединений (ну, типа того же томката или commons-dbcp2), то Спринг Бут её увидит первее всех и скажет: "О, а вот и специалист подъехал!". И автоматом выберет её, а не нашего тихоню HikariCP. Такие дела.

  3. Молчаливый пай-мальчик по умолчанию. Если ты не орал приказами и не тащил в проект левых продавцов, то Спринг Бут вздохнёт и скажет: "Ладно, давайте самого проверенного". И достанется с полки HikariCP. Но только при одном условии — что он вообще у тебя на этой полке есть (а он есть, если ты взял стартер для JPA или JDBC).

А теперь практический вывод, чтобы не обосраться: Если ты вдруг добавил какую-нибудь зависимость с другим пулом — он и вылезет, как хитрая жопа из штанов. Хочешь точно, чтобы работал HikariCP? Либо выкидывай нахуй всех конкурентов из зависимостей, либо дай тот самый прямой приказ из первого пункта: spring.datasource.type=com.zaxxer.hikari.HikariDataSource. Тогда уже ни у кого не будет вопросов.