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

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

вот что у меня было для 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

13 ответов


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

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

}

приложение.в формате 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 в dependecies
  2. Настройки Приложения.в формате YML

приложение.в формате 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:)


вы можете просто использовать приложение.yml / приложение.только свойства. Нет необходимости явно создавать any DataSource Бин

вам нужно исключить 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>

как вы не будете создавать DataSource bean, вы должны явно указать использование Hikari через spring.datasource.type со значением com.zaxxer.hikari.HikariDataSource в приложение.yml / приложение.свойства

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

в вашем приложении.yml / приложение.свойства, вы могли бы настройте конкретные параметры Hikari, такие как размер пула и т. д. В spring.datasource.hikari.*


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

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

  1. Spring Boot Starter JPA (Web & Security - дополнительно)
  2. Gradle построить тоже
  3. PostgreSQL работает и настраивается с базой данных (т. е. схемой, пользователем, БД)

вам нужно следующее 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. сначала исключить, инструктирует gradle, который исключает jdbc-tomcat пул соединений при загрузке spring-boot-starter-data-jpa зависимостей. Это может быть достигнуто путем создания spring.datasource.type=com.zaxxer.hikari.HikariDataSource также, но я не хочу дополнительной зависимости, если мне это не нужно
  2. второй исключить, поручает 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 конфигурация в my application.properties и все с честью, но не очень-то и наткнулся по следующим вопросам

  • Spring boot не удалось узнать детали базы данных (т. е. 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 ведут себя так, как ожидалось, и я закончил со следующим .

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 

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

  • весна.источник.x (Spring auto-configure выберет их, так что будет HikariCP)
  • весна.источник.Хикари.x (HikariCP выбирает их, чтобы настроить пул, обратите внимание на имена полей camelCase)
  • весна.jpa.зимовать.соединение.provider_class (инструктирует Spring использовать новый HibernateConnectionProvider)
  • весна.jpa.свойства.зимовать.x (используется весной для автоматической настройки JPA, обратите внимание на имена полей с подчеркиванием)

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

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

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

на статьи в HikariCP это на GitHub wiki показывает, как настроить пружину Загрузка с JPA, но, не хватает объяснений и деталей.

вышеупомянутые два файла также доступны в качестве публичного gist https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6


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

поставить в classpath.

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;
}

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

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
   }
}

вы не можете использовать подход dataSourceClassName в приложении.конфигурации свойств, как сказал @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 boot выводит из весны.источник.url свойство драйвера и в то же время установка dataSourceClassName создает это исключение. Сделать его правильно ваше заявление.свойства должны выглядеть примерно так для источника данных 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 в вашем пути к классам добавляется большую часть времени транзитивной зависимостью. Если они присутствуют в classpath Spring Boot, будет настроен источник данных с использованием пула соединений по умолчанию, который является tomcat. HikariCP будет использоваться только для создания источника данных, если в classpath нет другого поставщика. есть запасной вариант последовательность от tomcat - > к HikariCP - > к общему DBCP.


вы можете использовать подход dataSourceClassName, вот пример с MySQL. (Проверено с помощью spring boot 1.3 и 1.4)

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

пом.в 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>

приложение.свойства

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


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

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

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


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

spring.datasource.maximumPoolSize=20

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


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

построить.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 в соответствии с вашей базовой БД. Вот и все, код не требуется.


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

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

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

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

Мои Настройки:
Весенняя загрузка v1.5.10
Хикари В. 3.2.X (для оценки)

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

добавить следующее в приложение.свойства:-

весна.автоконфигурация.exclude=org.springframework.сапог.автоконфигурация.интерфейс jdbc.DataSourceAutoConfiguration

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

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

Примечание :::
общественный класс HikariDataSource расширяет HikariConfig

вам нужно

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

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

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

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

весна.источник.Хикари.allow-pool-suspension=true
весна.источник.Хикари.auto-commit=false
весна.источник.Хикари.каталог=
весна.источник.Хикари.connection-init-sql=
весна.источник.Хикари.connection-test-query=
весна.источник.Хикари.соединение-таймаут=100
весна.источник.Хикари.data-source-class-name=
весна.источник.Хикари.источник данных-j-n-d-i=
весна.источник.Хикари.driver-class-name=
весна.источник.Хикари.ожидания-ожидания=50
весна.источник.Хикари.инициализация-fail-fast=true
весна.источник.Хикари.isolate-internal-queries=true
весна.источник.Хикари.с JDBC-URL-адрес=
весна.источник.Хикари.leak-detection-threshold=
весна.источник.Хикари.login-timeout=60
весна.источник.Хикари.max-lifetime=
весна.источник.Хикари.максимум-бассейн-размер=500
весна.источник.Хикари.минимум-холостой ход=30
весна.источник.Хикари.password=
весна.источник.Хикари.pool-name=
весна.источник.Хикари.только для чтения=true
весна.источник.Хикари.регистр-mbeans, который, правда=
весна.источник.Хикари.транзакция-изоляция=
весна.источник.Хикари.username=
весна.источник.Хикари.validation-timeout=


Я использую Spring Boot 2.0.4.ОСВОБОЖДАТЬ. Hikari-пул соединений по умолчанию и .hikari больше не нужно.

приложение.свойства

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.autocommit=false
spring.datasource.poolname=myPool

приложение.в формате YML

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

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

@Configuration
public class DataSourceConfiguration {

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