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

Я пытаюсь настроить 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

person Kevin M    schedule 21.10.2014    source источник
comment
Какую версию Spring Boot вы используете?   -  person geoand    schedule 22.10.2014
comment
1.2.0.M1 Думаю, я понял, как установить свойства, чтобы установить такие вещи, как maximumPoolSize для hikariCP. Но мне не удалось заставить конфигурацию работать с использованием рекомендованного hikariCP способа с использованием dataSourceClassName и serverName вместо driverClassName и jdbc url. Так что я отказался от этой части. Если кто-то сможет понять эту часть, это поможет   -  person Kevin M    schedule 22.10.2014
comment
Я попробую 1.2.0.M1 позже, и я узнаю все, что выложу   -  person geoand    schedule 22.10.2014
comment
Вы не можете использовать подход dataSourceClassName с автоконфигурацией источника данных Spring Boot, поскольку для этого требуется, чтобы был установлен spring.datasource.url. Обратите внимание, что вам не нужно указывать driverClassName, так как Boot будет выводить его из jdbcUrl.   -  person Andy Wilkinson    schedule 22.10.2014
comment
application.properties: spring.datasource.hikari.*, документация: github.com/brettwooldridge/HikariCP   -  person kinjelom    schedule 10.08.2017
comment
Спасибо за обновление. Изначально, еще в 2014 году, они были указаны именно так.   -  person Kevin M    schedule 11.08.2017


Ответы (17)


@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 :)

person Sergey Bulavkin    schedule 19.10.2015
comment
Я думаю, что это гораздо лучший, более портативный подход. Ваше здоровье! - person Jesús Zazueta; 22.10.2015
comment
Это можно было бы использовать и для стандартной конфигурации пружины, но важно одно. Хикари использовал 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); }} - person Tomas Hanus; 23.12.2015
comment
Извините, это немного запоздалый ответ, но решение @Sergey следует немного изменить, чтобы получить все свойства. Чтобы получить специфические свойства DS для hikari, вам необходимо установить ключ как spring.datasource. dataSourceProperties вместо spring.datasource.hikari - person bluelabel; 23.06.2017
comment
Раньше нам просто нужно было посмотреть, как он настроен, просмотрев документацию источника данных, теперь стало еще хуже, теперь нам также нужно знать, как он настроен при использовании Spring Boot. Я действительно не думаю, что эта автоматическая конфигурация действительно нам помогает. - person supertonsky; 25.03.2018
comment
Я просто потратил несколько часов, пытаясь заставить это работать, но hikari игнорировал мои параметры конфигурации в файле yml (максимальный размер пула в моем случае). В случае, если кто-то еще столкнется с этим: не забудьте сделать отступ для параметров под hikari !! Пример в этом посте правильный, но в моем случае мой максимальный размер пула был выровнен под буквой h, а не двумя пробелами с отступом ... - person AnOttawan; 21.04.2021

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

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

статья в github HikariCP wiki показывает, как настроить Spring Boot с JPA, но без объяснения и деталей.

Вышеупомянутые два файла также доступны как общедоступный https://gist.github.com/rhamedy/b3cb936061cc13b86acdfe2 / а>

person Raf    schedule 12.11.2017

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

Вам нужно исключить 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, вы должны явно указать 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.*

person user3544765    schedule 10.08.2016
comment
Для выполнения этой работы не нужно исключать Tomcat, достаточно добавить spring.datasource.type. - person Michael Piefel; 06.10.2016
comment
@MichaelPiefel Вам нужно сделать исключение. В javadoc DataSourceBuilder говорится: Если Tomcat, HikariCP или Commons DBCP находятся на пути к классам, один из них будет выбран (в этом порядке сначала Tomcat). Мои испытания подтверждают это. - person Jan Bodnar; 12.04.2017
comment
@JanBodnar: DataSourceConfiguration, который используется в автоконфигурации, имеет конфигурации, зависящие от spring.datasource.type, если он вообще установлен. Итак, у меня есть tomcat-jdbc на моем пути к классам, и я все еще использую HikariCP в качестве пула. Мои испытания подтверждают это. Возможно, мы говорим здесь о очень разных версиях Spring Boot. - person Michael Piefel; 12.04.2017
comment
@MichaelPiefel Интересно, что мне удалось запустить его нормально без исключения с конфигурацией Java, только используя DataSourceBuilder.create () ... type (com.zaxxer.hikari.HikariDataSource.class). С настройкой в ​​файле yaml у меня не сработало. Так что тут должна быть какая-то уловка. - person Jan Bodnar; 12.04.2017

Я использую 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();
    }
}
person Water    schedule 14.09.2018

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

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

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

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

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

    return dataSource;
}
person Sanghyun Lee    schedule 19.08.2015

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

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
person Sthita    schedule 28.06.2018

Это поможет всем, кто хочет настроить 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
person patelb    schedule 08.02.2019
comment
Этот ответ ценен тем, что предоставляет рабочий пример со свойствами источника данных! - person Mauro Molinari; 17.06.2020

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

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
   }
}
person Jesús Zazueta    schedule 10.02.2015
comment
Это. Однако его легко перевести на Java. - person Jesús Zazueta; 19.02.2015
comment
Да, теперь я понимаю, что мне нужно это сделать, потому что теперь я хочу настроить метрики. И единственный способ, которым я могу это сделать, - это использовать этот JavaConfig, чтобы переопределить автоконфигурацию. Спасибо. - person Kevin M; 19.02.2015
comment
Да, помогает! Ты тоже получил мой голос ... Это классно? Это очень интересно, это как javascript :-) - person Joao Polo; 09.02.2016

Вы можете использовать подход 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 < / а>

person ydemartino    schedule 29.03.2016

вы не можете использовать подход 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.

person Shahid Yousuf    schedule 01.08.2015
comment
это было очень полезно, хотя мне пришлось выяснить несколько имен свойств, не упомянутых здесь, например stringType, для настройки свойств источника данных. - person comiventor; 01.03.2018
comment
Приятно знать, что это помогло. - person Shahid Yousuf; 12.07.2018


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

spring.datasource.maximumPoolSize=20

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

person Kevin M    schedule 22.10.2014
comment
Некоторое время я использую HikariCP в разных приложениях, и пока у меня не было проблем. Я использую подход HikariConfig, когда у вас есть вся ваша конфигурация в файле свойств. Как и ожидалось, работает с SpringBoot и SpringCore. Я также настраиваю maximumPoolSize. - person Davi Alves; 21.07.2015
comment
Он должен быть spring.datasource.maximum-pool-size, когда вы используете свойства конфигурации Spring, иначе maximumPoolSize - это имя параметра HikariCP. - person sura2k; 25.04.2017

Моя установка:
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, переданного в качестве аргумента конструктору.

Я верю в определение моего собственного класса Custom Configuration (@Configuration) для создания источника данных самостоятельно и заполнения его свойствами источника данных, определенными в отдельном файле (в отличие от традиционного: application.properties) < br>
Таким образом я могу определить свой собственный компонент sessionFactory, используя рекомендованный 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.connection-test-query =
spring.datasource.hikari.connection-timeout = 100
spring.datasource.hikari.data-source-class-name = < br> 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-query = 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
весна .datasource.hikari.minimum-idle = 30
spring.datasource.hikari.password =
spring.datasource.hikari.pool-nam e =
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 =

person Philip Dilip    schedule 18.06.2018
comment
spring.datasource.hikari.maximum-pool-size = 500 действительно ужасно, и от hikari это не рекомендуется :) github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing - person mertaksu; 28.04.2019
comment
Это был всего лишь образец конфигурации со значениями :) - person Philip Dilip; 20.06.2019

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

person Andy Brown    schedule 17.11.2017

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

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();
    }
}
person nagendra babu    schedule 09.02.2020

Теперь с HikcariCp в качестве пула соединений по умолчанию с новой версией весенней загрузки. Это можно сделать напрямую, как показано ниже.

@Configuration
public class PurchaseOrderDbConfig {
    
    @Bean
    @ConfigurationProperties(prefix = "com.sysco.purchaseorder.datasoure")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

}

application.yml

com:
  sysco:
    purchaseorder:
      datasoure:
        driverClassName: com.mysql.jdbc.Driver
        jdbcUrl: jdbc:mysql://localhost:3306/purchaseorder
        username: root
        password: root123
        idleTimeout: 600000

Если вы напечатаете значение тайм-аута простоя

ApplicationContext context=SpringApplication.run(ApiBluePrint.class, args);
   HikariDataSource dataSource=(HikariDataSource) context.getBean(DataSource.class);
   System.out.println(dataSource.getIdleTimeout());

вы получите значение 600000, где значение по умолчанию - 300000, если вы не определяете какое-либо настраиваемое значение.

person unknown    schedule 30.12.2020

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

person CelinHC    schedule 20.01.2020