Как мне настроить HikariCP в моем приложении Spring Boot в моих файлах application.properties?


92

Я пытаюсь настроить HikariCP в моем приложении Spring Boot (1.2.0.M1), чтобы я мог протестировать его с помощью вместо Tomcat DBCP. Я хотел бы настроить пул соединений в моем файле application.properties, как это делал с Tomcat, но я не могу понять, как мне это делать. Все примеры, которые я нашел, показывают либо стиль JavaConfig, либо использование отдельного файла свойств HikariCP. Может ли кто-нибудь помочь мне выяснить имена свойств, чтобы настроить их в application.properties? Я также хотел бы перейти от подхода driverClassName к подходу DataSourceClassName, поскольку он выглядит более чистым и рекомендуется. Возможно ли это также в моих файлах application.properties?

Вот что у меня было для Tomcat DBCP (просто базовая конфигурация, не полностью удаленная)

spring.datasource.validation-query=SELECT 1
spring.datasource.max-active=10
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=5
spring.datasource.test-on-borrow=true
spring.datasource.test-on-return=true

И в настоящее время я использую driverClassName и jdbc url для настройки соединения:

spring.datasource.url=jdbc:mysql://localhost:3306/myDb
spring.datasource.driverClassName=com.mysql.jdbc.Driver

Какую версию Spring Boot вы используете?
geoand

1.2.0.M1 Думаю, я понял, как установить свойства для установки таких вещей, как maximumPoolSize для hikariCP. Но мне не удалось заставить конфигурацию работать с использованием рекомендованного hikariCP способа с использованием dataSourceClassName и serverName вместо driverClassName и jdbc url. Так что я отказался от этой части. Если кто-то сможет понять эту часть, это поможет
Кевин М.

Я попробую 1.2.0.M1 позже и узнаю все, что
выложу

2
Вы не можете использовать подход dataSourceClassName с автоконфигурацией источника данных Spring Boot, поскольку для этого требуется, чтобы был установлен spring.datasource.url. Обратите внимание, что вам не нужно указывать driverClassName, поскольку Boot будет выводить его из jdbcUrl.
Энди Уилкинсон

1
application.properties:, spring.datasource.hikari.*документация: github.com/brettwooldridge/HikariCP
kinjelom

Ответы:


142
@Configuration
@ConfigurationProperties(prefix = "params.datasource")
public class JpaConfig extends HikariConfig {

    @Bean
    public DataSource dataSource() throws SQLException {
        return new HikariDataSource(this);
    }

}

application.yml

params:
  datasource:
    driverClassName: com.mysql.jdbc.Driver
    jdbcUrl: jdbc:mysql://localhost:3306/myDb
    username: login
    password: password
    maximumPoolSize: 5

ОБНОВЛЕНО! Начиная с версии Spring Boot 1.3.0 :

  1. Просто добавьте HikariCP в зависимости
  2. Настроить application.yml

application.yml

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    url: jdbc:h2:mem:TEST
    driver-class-name: org.h2.Driver
    username: username
    password: password
    hikari:
      idle-timeout: 10000

ОБНОВЛЕНО! Начиная с версии Spring Boot 2.0.0 :

Пул соединений по умолчанию изменился с Tomcat на Hikari :)


1
Я думаю, что это гораздо лучший, более портативный подход. Ура!
Хесус Зазуэта

2
Это можно было бы использовать и для стандартной конфигурации пружины, но важно одно. Хикари использовал URL-адрес источника данных через jdbcUrl, но использовал URL-адрес. {частный строковый URL; @Bean public DataSource dataSource () выбрасывает SQLException {return new HikariDataSource (this); } общедоступная строка getUrl () {URL возврата; } public void setUrl (String url) {this.url = url; // HikariConfig хранит JDBC-URL в свойстве jdbcUrl, но Spring предоставляет это свойство как url ​​this.setJdbcUrl (url); }}
Томас Ханус

Извините, это немного запоздалый ответ, но решение @Sergey следует немного изменить, чтобы получить все свойства. Чтобы получить специфические свойства DS для hikari, вам нужно установить ключ как «spring.datasource. DataSourceProperties» вместо «spring.datasource.hikari»
bluelabel

3
Раньше нам просто нужно было посмотреть, как он настроен, просматривая документацию источника данных, теперь стало еще хуже, теперь нам также нужно знать, как он настроен при использовании Spring Boot. Я действительно не думаю, что эта автоматическая конфигурация действительно нам помогает.
supertonsky

31

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

У меня есть Spring Bootпроект установки со JPA, Web, Securityстартерами (с использованием Spring Initializer ) для использования PostgreSQLв качестве базы данных с HikariCPпулом соединений.
Я использовал в Gradleкачестве инструмента сборки и хотел бы поделиться тем, что у меня сработало при следующих предположениях:

  1. Spring Boot Starter JPA (Интернет и безопасность - необязательно)
  2. Сборка Gradle тоже
  3. Запуск PostgreSQL и настройка с базой данных (т.е. схемой, пользователем, db)

Вам понадобится следующее, build.gradleесли вы используете Gradleили эквивалент, pom.xmlесли вы используете maven

buildscript {
    ext {
        springBootVersion = '1.5.8.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'war'

group = 'com'
version = '1.0'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-aop')

    // Exclude the tomcat-jdbc since it's used as default for connection pooling
    // This can also be achieved by setting the spring.datasource.type to HikariCP 
    // datasource see application.properties below
    compile('org.springframework.boot:spring-boot-starter-data-jpa') {
        exclude group: 'org.apache.tomcat', module: 'tomcat-jdbc'
    }
    compile('org.springframework.boot:spring-boot-starter-security')
    compile('org.springframework.boot:spring-boot-starter-web')
    runtime('org.postgresql:postgresql')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('org.springframework.security:spring-security-test')

    // Download HikariCP but, exclude hibernate-core to avoid version conflicts
    compile('com.zaxxer:HikariCP:2.5.1') {
        exclude group: 'org.hibernate', module: 'hibernate-core'
    }

    // Need this in order to get the HikariCPConnectionProvider
    compile('org.hibernate:hibernate-hikaricp:5.2.11.Final') {
        exclude group: 'com.zaxxer', module: 'HikariCP'
        exclude group: 'org.hibernate', module: 'hibernate-core'
    }
}

Вышеупомянутое множество исключений build.gradle, потому что

  1. Сначала exclude, инструктирует gradle, который исключает jdbc-tomcatпул соединений при загрузке spring-boot-starter-data-jpaзависимостей. Этого можно достичь, установив spring.datasource.type=com.zaxxer.hikari.HikariDataSourceтакже, но, мне не нужна дополнительная зависимость, если она мне не нужна.
  2. Во-вторых, exclude, инструктирует gradle исключить hibernate-coreпри загрузке com.zaxxerзависимости, потому что hibernate-coreон уже загружен, Spring Bootи мы не хотим получать разные версии.
  3. В-третьих, исключить, указывает Gradle исключить hibernate-coreпри загрузке hibernate-hikaricpмодуля, который необходим для использования HikariCP в org.hibernate.hikaricp.internal.HikariCPConnectionProviderкачестве поставщика подключения вместо устаревшегоcom.zaxxer.hikari.hibernate.HikariConnectionProvider

Как только я понял, build.gradleчто нужно сохранить, а что нет, я был готов скопировать / вставить datasourceконфигурацию в свою application.propertiesи ожидал, что все будет работать отлично, но не совсем, и я наткнулся на следующие проблемы

  • При загрузке Spring не удалось узнать детали базы данных (например, URL-адрес, драйвер), следовательно, не удалось настроить jpa и hibernate (потому что я не назвал значения ключей свойств правильно)
  • HikariCP возвращается к com.zaxxer.hikari.hibernate.HikariConnectionProvider
  • После указания Spring использовать нового поставщика соединений для автоматической настройки hibernate / jpa, HikariCP не удалось, потому что он искал некоторые key/valueиз них application.propertiesи жаловался dataSource, dataSourceClassName, jdbcUrl. Мне пришлось отлаживать, HikariConfig, HikariConfigurationUtil, HikariCPConnectionProviderи я обнаружил, что HikariCPне могу найти свойства из, application.propertiesпотому что он был назван по-другому.

Во всяком случае, именно здесь мне пришлось полагаться на HikariCPметод проб и ошибок и убедиться, что он может выбирать свойства (т.е. источник данных, который содержит детали базы данных, а также свойства пула), а также Sping Boot ведет себя так, как ожидалось, и в итоге я получил следующий application.propertiesфайл.

server.contextPath=/
debug=true

# Spring data source needed for Spring boot to behave
# Pre Spring Boot v2.0.0.M6 without below Spring Boot defaults to tomcat-jdbc connection pool included 
# in spring-boot-starter-jdbc and as compiled dependency under spring-boot-starter-data-jpa
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.url=jdbc:postgresql://localhost:5432/somedb
spring.datasource.username=dbuser
spring.datasource.password=dbpassword

# Hikari will use the above plus the following to setup connection pooling
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=20
spring.datasource.hikari.idleTimeout=30000
spring.datasource.hikari.poolName=SpringBootJPAHikariCP
spring.datasource.hikari.maxLifetime=2000000
spring.datasource.hikari.connectionTimeout=30000

# Without below HikariCP uses deprecated com.zaxxer.hikari.hibernate.HikariConnectionProvider
# Surprisingly enough below ConnectionProvider is in hibernate-hikaricp dependency and not hibernate-core
# So you need to pull that dependency but, make sure to exclude it's transitive dependencies or you will end up 
# with different versions of hibernate-core 
spring.jpa.hibernate.connection.provider_class=org.hibernate.hikaricp.internal.HikariCPConnectionProvider

# JPA specific configs
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql=true
spring.jpa.properties.hibernate.id.new_generator_mappings=false
spring.jpa.properties.hibernate.default_schema=dbschema
spring.jpa.properties.hibernate.search.autoregister_listeners=false
spring.jpa.properties.hibernate.bytecode.use_reflection_optimizer=false

# Enable logging to verify that HikariCP is used, the second entry is specific to HikariCP
logging.level.org.hibernate.SQL=DEBUG
logging.level.com.zaxxer.hikari.HikariConfig=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE 

Как показано выше, конфигурации разделены на категории на основе следующих шаблонов именования

  • spring.datasource.x (автоматическая настройка Spring выберет их, как и HikariCP)
  • spring.datasource.hikari.x (HikariCP выбирает их для настройки пула, обратите внимание на имена полей camelCase)
  • spring.jpa.hibernate.connection.provider_class ( указывает Spring использовать новый HibernateConnectionProvider)
  • spring.jpa.properties.hibernate.x (используется Spring для автоматической настройки JPA, обратите внимание на имена полей с подчеркиванием)

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

Добавление вышеуказанного application.propertiesс помощью build.gradle(или, по крайней мере, аналогичного) в версию проекта Spring Boot JPA (1.5.8) должно работать как шарм и подключаться к вашей предварительно настроенной базе данных (т.е. в моем случае это PostgreSQL, который оба HikariCP & Springвыясняют из того, spring.datasource.urlна каком драйвер базы данных для использования).

Я не видел необходимости создавать DataSourcebean-компонент, потому что Spring Boot может делать все за меня, просто заглянув в него, application.propertiesи это здорово.

В статье на вики-сайте Github HikariCP показано, как настроить Spring Boot с JPA, но отсутствуют объяснения и подробности.

Эти два файла также доступны как общедоступный https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6


Я боролся с этим прямо перед публикацией. Спасибо!
Bogdan Pucașu

Рад, что помог тебе! 👍
Raf

Раф, у тебя отличный ответ. Мне было интересно, сможете ли вы опубликовать изменения, необходимые для Spring Boot 2.0.0.M6. Проблемы с конфигурацией, которая не подобрана, и руководство по миграции еще не обновлено
Мэтью Фонтана,

Привет, Мэт, я использовал выпуск 1.5.8, когда поделился здесь своим решением. Я хотел быстро попробовать 2.0.0.M6, но, к сожалению, они требуют, чтобы у вас была более высокая версия gradle. Единственное изменение, которое я могу вспомнить в 2.0.0.M6, - это создание пула соединений по умолчанию HikariCP для spring jpa см. Здесь github.com/spring-projects/spring-boot/commit/… Попробуйте отладить HikariConfig, HikariConfigurationUtil, HikariCPConnectionProvider, чтобы убедиться, что недвижимость подобрана.
Raf

26

Вы можете просто использовать только application.yml / application.properties. Нет необходимости явно создавать DataSourceBean

Вам нужно исключить tomcat-jdbc, как указано ydemartino

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jdbc</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Поскольку вы не будете создавать DataSourcebean-компонент, вы должны явно указать using Hikari через spring.datasource.typeзначение com.zaxxer.hikari.HikariDataSourceв application.yml / application.properties.

spring:
    datasource:
        hikari:
            connection-test-query: SELECT 1 FROM DUAL
            minimum-idle: 1
            maximum-pool-size: 5
            pool-name: yourPoolName
            auto-commit: false
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/myDb
        username: login
        password: password
        type: com.zaxxer.hikari.HikariDataSource

В вашем application.yml / application.properties вы можете настроить конкретные параметры Hikari, такие как размер пула и т. Д. В spring.datasource.hikari.*


Для выполнения этой работы не нужно исключать Tomcat, spring.datasource.typeдостаточно добавить .
Майкл Пифель

3
@MichaelPiefel Вам нужно сделать исключение. В javadoc DataSourceBuilderговорится: Если Tomcat, HikariCP или Commons DBCP находятся на пути к классам, один из них будет выбран (в этом порядке сначала с Tomcat). Мои испытания подтверждают это.
Ян Боднар

1
@JanBodnar:, DataSourceConfigurationкоторый используется в автоконфигурации, имеет конфигурации в зависимости от того, установлен spring.datasource.typeли он вообще. Итак, у меня есть tomcat-jdbcпуть к классам, и я все еще использую HikariCP в качестве пула. Мои испытания подтверждают это. Возможно, мы говорим здесь о очень разных версиях Spring Boot.
Майкл Пифель

1
@MichaelPiefel Интересно, что мне удалось запустить его нормально без исключения с конфигурацией Java, только используя DataSourceBuilder.create () ... type (com.zaxxer.hikari.HikariDataSource.class). С настройкой в ​​файле yaml у меня не сработало. Так что должен быть какой-то подвох.
Ян Боднар

14

Я использую Spring Boot 2.0.4.RELEASE. Hikari - это пул соединений по умолчанию, и .hikariв нем больше нет необходимости.

application.properties

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.jdbcUrl=jdbc:mysql://localhost:3306/myDB...
spring.datasource.username=xxx
spring.datasource.password=xxx
spring.datasource.poolname=myPool

application.yml

spring:
    datasource:
        driverClassName: com.mysql.jdbc.Driver
        jdbcUrl: jdbc:mysql://localhost:3306/myDB...
        username: xxx
        password: xxx
        poolName: myPool

И configurationне нужно расширять HikariConfig, и DataSourceBuilderможно использовать, как было раньше.

@Configuration
public class DataSourceConfiguration {

    @Bean(name="myDataSource")
    @ConfigurationProperties("spring.datasource")
    public DataSource myDataSource() {
        return DataSourceBuilder.create().build();
    }
}

10

Согласно документации он изменен,

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html

Пример :

spring:
    datasource:
        url: 'jdbc:mysql://localhost/db?useSSL=false'
        username: root
        password: pass
        driver: com.mysql.jdbc.Driver
        hikari:
            minIdle: 10
            idle-timeout: 10000
            maximumPoolSize: 30

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

autoCommit
connectionTimeout
idleTimeout
maxLifetime
connectionTestQuery
connectionInitSql
validationTimeout
maximumPoolSize
poolName
allowPoolSuspension
readOnly
transactionIsolation
leakDetectionThreshold

9

Вам не нужен избыточный код для помещения значений свойств в переменные. Вы можете установить свойства напрямую в файле свойств.

Поместите hikari.propertiesфайл в путь к классам.

driverClassName=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/myDb
connectionTestQuery=SELECT 1
maximumPoolSize=20
username=...
password=...

И сделайте такой компонент источника данных.

@Bean(destroyMethod = "close")
public DataSource dataSource() throws SQLException {
    HikariConfig config = new HikariConfig("/hikari.properties");
    HikariDataSource dataSource = new HikariDataSource(config);

    return dataSource;
}

8

Это работает для моего загрузочного приложения, если это помогает. Этот класс сообщает вам, какие свойства ищет объект конфигурации:

https://github.com/brettwooldridge/HikariCP/blob/2.3.x/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java

Я думаю, что можно поддерживать несколько источников данных, добавляя datasource_whateverключи свойств в исходный файл конфигурации. Ура!

@Configuration
class DataSourceConfig {

   @Value('${spring.datasource.username}')
   private String user;

   @Value('${spring.datasource.password}')
   private String password;

   @Value('${spring.datasource.url}')
   private String dataSourceUrl;

   @Value('${spring.datasource.dataSourceClassName}')
   private String dataSourceClassName;

   @Value('${spring.datasource.connectionTimeout}')
   private int connectionTimeout;

   @Value('${spring.datasource.maxLifetime}')
   private int maxLifetime;

   @Bean
   public DataSource primaryDataSource() {
      Properties dsProps = [url: dataSourceUrl, user: user, password: password]
      Properties configProps = [
            connectionTestQuery: 'select 1 from dual',
            connectionTimeout: connectionTimeout,
            dataSourceClassName: dataSourceClassName,
            dataSourceProperties: dsProps,
            maxLifetime: maxLifetime
      ]

      // A default max pool size of 10 seems reasonable for now, so no need to configure for now.
      HikariConfig hc = new HikariConfig(configProps)
      HikariDataSource ds = new HikariDataSource(hc)
      ds
   }
}

Это. Однако его легко перевести на Java.
Хесус Зазуэта,

Да, теперь я понимаю, что мне нужно это сделать, потому что теперь я хочу настроить метрики. И единственный способ, которым я могу это сделать, - это использовать этот JavaConfig, чтобы переопределить автоконфигурацию. Спасибо.
Kevin M

Да, помогает! Ты тоже получил мой голос ... Это классно? Это очень интересно, это как javascript :-)
Жоао Поло

8

Вы можете использовать подход dataSourceClassName, вот пример с MySQL. (Проверено с пружинным чехлом 1.3 и 1.4)

Сначала вам нужно исключить tomcat-jdbc из пути к классам, поскольку он будет выбран в пользу hikaricp.

pom.xml

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-jdbc</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

application.properties

spring.datasource.dataSourceClassName=com.mysql.jdbc.jdbc2.optional.MysqlDataSource
spring.datasource.dataSourceProperties.serverName=localhost
spring.datasource.dataSourceProperties.portNumber=3311
spring.datasource.dataSourceProperties.databaseName=mydb
spring.datasource.username=root
spring.datasource.password=root

Тогда просто добавьте

@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
    return DataSourceBuilder.create().build();
}

Я создал тестовый проект здесь: https://github.com/ydemartino/spring-boot-hikaricp


8

вы не можете использовать подход dataSourceClassName в конфигурациях application.properties, как сказал @Andy Wilkinson. если вы все равно хотите иметь dataSourceClassName, вы можете использовать Java Config как:

@Configuration
@ComponentScan
class DataSourceConfig {

 @Value("${spring.datasource.username}")
private String user;

@Value("${spring.datasource.password}")
private String password;

@Value("${spring.datasource.url}")
private String dataSourceUrl;

@Value("${spring.datasource.dataSourceClassName}")
private String dataSourceClassName;

@Value("${spring.datasource.poolName}")
private String poolName;

@Value("${spring.datasource.connectionTimeout}")
private int connectionTimeout;

@Value("${spring.datasource.maxLifetime}")
private int maxLifetime;

@Value("${spring.datasource.maximumPoolSize}")
private int maximumPoolSize;

@Value("${spring.datasource.minimumIdle}")
private int minimumIdle;

@Value("${spring.datasource.idleTimeout}")
private int idleTimeout;

@Bean
public DataSource primaryDataSource() {
    Properties dsProps = new Properties();
    dsProps.put("url", dataSourceUrl);
    dsProps.put("user", user);
    dsProps.put("password", password);
    dsProps.put("prepStmtCacheSize",250);
    dsProps.put("prepStmtCacheSqlLimit",2048);
    dsProps.put("cachePrepStmts",Boolean.TRUE);
    dsProps.put("useServerPrepStmts",Boolean.TRUE);

    Properties configProps = new Properties();
       configProps.put("dataSourceClassName", dataSourceClassName);
       configProps.put("poolName",poolName);
       configProps.put("maximumPoolSize",maximumPoolSize);
       configProps.put("minimumIdle",minimumIdle);
       configProps.put("minimumIdle",minimumIdle);
       configProps.put("connectionTimeout", connectionTimeout);
       configProps.put("idleTimeout", idleTimeout);
       configProps.put("dataSourceProperties", dsProps);

   HikariConfig hc = new HikariConfig(configProps);
   HikariDataSource ds = new HikariDataSource(hc);
   return ds;
   }
  } 

причина, по которой вы не можете использовать dataSourceClassName, потому что он будет вызывать и исключение

Caused by: java.lang.IllegalStateException: both driverClassName and dataSourceClassName are specified, one or the other should be used.

что означает, что весенняя загрузка выводится из свойства spring.datasource.url Driver, и в то же время установка dataSourceClassName создает это исключение. Чтобы все было правильно, ваше application.properties должно выглядеть примерно так для источника данных HikariCP:

# hikariCP 
  spring.jpa.databasePlatform=org.hibernate.dialect.MySQLDialect
  spring.datasource.url=jdbc:mysql://localhost:3306/exampledb
  spring.datasource.username=root
  spring.datasource.password=
  spring.datasource.poolName=SpringBootHikariCP
  spring.datasource.maximumPoolSize=5
  spring.datasource.minimumIdle=3
  spring.datasource.maxLifetime=2000000
  spring.datasource.connectionTimeout=30000
  spring.datasource.idleTimeout=30000
  spring.datasource.pool-prepared-statements=true
  spring.datasource.max-open-prepared-statements=250

Примечание. Проверьте, есть ли в пути к классам файлы tomcat-jdbc.jar или commons-dbcp.jar, которые в большинстве случаев добавляются в результате транзитивной зависимости. Если они присутствуют в пути к классам, Spring Boot настроит источник данных с использованием пула соединений по умолчанию, которым является tomcat. HikariCP будет использоваться для создания источника данных, только если в пути к классам нет другого поставщика. есть резервная последовательность от tomcat -> к HikariCP -> к Commons DBCP.


1
это было очень полезно, хотя мне пришлось выяснить несколько имен свойств, не упомянутых здесь, например stringType, для настройки свойств источника данных.
comiventor 01

Приятно знать, что это помогло.
Shahid Yousuf

8

Это поможет всем, кто хочет настроить hikaricp для своего приложения с помощью автоматической настройки Spring. В моем проекте я использую spring boot 2 с hikaricp в качестве пула соединений JDBC и mysql в качестве базы данных. Одна вещь, которую я не видел в других ответах, - это то, data-source-propertiesчто можно использовать для установки различных свойств, которые недоступны в spring.datasource.hikari.*пути. Это эквивалентно использованию HikariConfigкласса. Чтобы настроить пул соединений с источником данных и hikaricp для конкретных свойств mysql, я использовал аннотацию автоматической настройки Spring и следующие свойства в файле application.yml.

Поместите @EnableAutoConfigurationв один из ваших файлов bean-компонентов конфигурации.

Файл application.yml может выглядеть так.

spring:
  datasource:
    url: 'jdbc:mysql://127.0.0.1:3306/DATABASE?autoReconnect=true&useSSL=false'
    username: user_name
    password: password
    hikari:
      maximum-pool-size: 20
      data-source-properties:
        cachePrepStmts: true
        prepStmtCacheSize: 250
        prepStmtCacheSqlLimit: 2048
        useServerPrepStmts: true
        useLocalSessionState: true
        rewriteBatchedStatements: true
        cacheResultSetMetadata: true
        cacheServerConfiguration: true
        elideSetAutoCommits: true
        maintainTimeStats: false

Этот ответ полезен для предоставления рабочего примера со свойствами источника данных!
Мауро Молинари

6

Вот и хорошие новости. HikariCP теперь является пулом соединений по умолчанию с Spring Boot 2.0.0.

Примечания к выпуску Spring Boot 2.0.0

Технология пула баз данных по умолчанию в Spring Boot 2.0 была переключена с Tomcat Pool на HikariCP. Мы обнаружили, что Hakari предлагает превосходную производительность, и многие из наших пользователей предпочитают ее Tomcat Pool.


5

Получается, что почти все настройки по умолчанию для HikariCP у меня работают, кроме количества подключений к БД. Я установил это свойство в своем application.properties:

spring.datasource.maximumPoolSize=20

И Энди Уилкинсон прав, насколько я могу судить, в том, что вы не можете использовать подход конфигурации dataSourceClassName для HikariCP с Spring Boot.


2
Некоторое время я использую HikariCP в разных приложениях, и пока у меня не было проблем. Я использую подход HikariConfig, когда у вас есть вся ваша конфигурация в файле свойств. Как и ожидалось, работает с SpringBoot и SpringCore. Я также настраиваю maximumPoolSize.
Дави Алвес

Это должно быть, spring.datasource.maximum-pool-sizeкогда вы используете свойства конфигурации maximumPoolSizeSpring , иначе это имя параметра HikariCP.
sura2k

3

My SetUp:
Spring Boot v1.5.10
Hikari v.3.2.x (для оценки)

Чтобы действительно понять конфигурацию источника данных Hikari, я рекомендую отключить автоконфигурацию Spring Boot для источника данных.

Добавьте в application.properties следующее: -

spring.autoconfigure.exclude = org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

Это отключит возможность Spring Boot самостоятельно настраивать DataSource.

Теперь у вас есть возможность определить свою собственную настраиваемую конфигурацию для создания bean-компонента HikariDataSource и наполнить его желаемыми свойствами.

ПРИМЕЧАНИЕ :::
открытый класс HikariDataSource расширяет HikariConfig

Вам нужно

  1. заполнить объект HikariConfig, используя желаемые свойства Hikari
  2. инициализировать объект HikariDataSource с помощью объекта HikariConfig, переданного в качестве аргумента конструктору.

Я верю в определение моего собственного класса пользовательской конфигурации (@Configuration), чтобы создать источник данных самостоятельно и заполнить его свойствами источника данных, определенными в отдельном файле (чем в традиционном: application.properties).

Таким образом я могу определить свой собственный sessionFactory Bean с использованием Hibernate рекомендуется: класс "LocalSessionFactoryBean" и заполнить его своим источником данных Hikari> и другими свойствами на основе Hiberante-JPA.

Сводка свойств источника данных Hikari на основе Spring Boot: -

spring.datasource.hikari.allow-pool-
Suspension = true spring.datasource.hikari.auto-commit = false
spring.datasource.hikari.catalog =
spring.datasource.hikari.connection-init-sql =
spring.datasource.hikari. соединение-тест-запрос =
spring.datasource.hikari.connection-timeout = 100
spring.datasource.hikari.data-source-class-name =
spring.datasource.hikari.data-source-jndi =
spring.datasource.hikari.driver -class-name =
spring.datasource.hikari.idle-timeout = 50
spring.datasource.hikari.initialization-fail-fast = true
spring.datasource.hikari.isolate-internal-
questions = true spring.datasource.hikari.jdbc- url =
spring.datasource.hikari.leak-detection-threshold =
spring.datasource.hikari.login-timeout = 60
spring.datasource.hikari.max-life =
spring.datasource.hikari.maximum-pool-size = 500
spring.datasource.hikari.minimum-idle = 30
spring.datasource.hikari .password =
spring.datasource.hikari.pool-name =
spring.datasource.hikari.read-only = true
spring.datasource.hikari.register-mbeans = true
spring.datasource.hikari.transaction -olated =
spring.datasource.hikari .username =
spring.datasource.hikari.validation-timeout =


spring.datasource.hikari.maximum-pool-size = 500 действительно ужасно, и это не рекомендуется из hikari :) github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing
mertaksu

Это был всего лишь образец конфигурации с ценностями :)
Филип Дилип

2

В более поздних версиях Spring-Boot переключение на Hikari может быть выполнено полностью в конфигурации. Я использую, 1.5.6.RELEASEи этот подход работает.

build.gradle:

compile "com.zaxxer:HikariCP:2.7.3"

приложение YAML

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      idleTimeout: 60000
      minimumIdle: 2
      maximumPoolSize: 20
      connectionTimeout: 30000
      poolName: MyPoolName
      connectionTestQuery: SELECT 1

Измените connectionTestQueryв соответствии с вашей базовой БД. Вот и все, код не требуется.


2

Приведенный ниже код можно использовать для инициализации статического источника данных.

public class MyDataSource {
    private static final String DB_USERNAME="spring.datasource.username";
    private static final String DB_PASSWORD="spring.datasource.password";
    private static final String DB_URL ="spring.datasource.url";
    private static final String DB_DRIVER_CLASS="spring.datasource.driver-class-name";

    private static Properties properties = null;
    private static HikariDataSource dataSource;

    static {
        try {
            properties = new Properties();
            properties.load(new FileInputStream("src/main/resources/application.properties"));

            dataSource = new HikariDataSource();
            dataSource.setDriverClassName(properties.getProperty(DB_DRIVER_CLASS));

            dataSource.setJdbcUrl(properties.getProperty(DB_URL));
            dataSource.setUsername(properties.getProperty(DB_USERNAME));
            dataSource.setPassword(properties.getProperty(DB_PASSWORD));

            dataSource.setMinimumIdle(100);
            dataSource.setMaximumPoolSize(2000);
            dataSource.setAutoCommit(false);
            dataSource.setLoginTimeout(3);

        } catch (IOException | SQLException e) {
            ((Throwable) e).printStackTrace();
        }
    }

    public static DataSource getDataSource(){
        return dataSource;
    }

    public static Connection getConnection() throws SQLException{
        return getDataSource().getConnection();
    }
}

1

У меня возникли проблемы, и проблема заключалась в пробеле в концеspring.datasource.type = com.zaxxer.hikari.HikariDataSource

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.