Як налаштувати 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 ви використовуєте?
геоі

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

Я спробую 1.2.0.M1 спробувати пізніше, і я дізнаюся про все, що я опублікую
geoa

2
Ви не можете використовувати підхід dataSourceClassName з автоматичною конфігурацією Spring Boot DataSource, оскільки для цього потрібно встановити 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);
    }

}

застосування.имм

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

застосування.имм

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
Я думаю, що це набагато кращий, портативніший підхід. Ура!
Jesús Zazueta

2
Це може бути використано і для стандартної конфігурації пружини, але є думка, що це важливо. Hikari використовував url джерела даних через jdbcUrl, але весну через url. {приватна URL-адреса рядка; @Bean public DataSource dataSource () кидає SQLException {return new HikariDataSource (this); } public String getUrl () {return 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. Спочатку виключає, вказує 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і очікував, що все буде працювати з яскравими кольорами, але, насправді, я наткнувся на наступні проблеми

  • Весняне завантаження не вдалося дізнатись деталі бази даних (тобто 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 (Весняна автоматична конфігурація вибере їх, як і 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 завантаження JPA (1.5.8) має працювати як шарм і підключення до попередньо сконфигурированной базі даних (тобто в моєму випадку це PostgreSQL , що і HikariCP & Springз'ясувати , від , spring.datasource.urlна якому використовувати драйвер бази даних).

Я не бачив необхідності створювати DataSourceбоб, і це тому, що Spring Boot здатний зробити все для мене, просто задивившись, application.propertiesі це акуратно.

Стаття в GitHub HikariCP в вікі показує , як налаштувати Spring Черевик з JPA , але, не вистачає пояснень і деталей.

Наведені вище два файли також доступні як загальнодоступна історія https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6


Я боровся з цим прямо перед тим, як ви розмістили. Дякую!
Богдан Пуньцау

Радий, що це вам допомогло! 👍
Раф,

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

Гей, Мет, я використовував версію 1.5.8, коли ділився тут своїм рішенням. Я хотів швидко спробувати 2.0.0.M6, але, на жаль, вони вимагають наявності більш високої версії gradle. Єдиною зміною, яку я пам’ятаю у 2.0.0.M6, було б створення пулу підключень HikariCP за замовчуванням для весняного jpa див. Тут github.com/spring-projects/spring-boot/commit/… Спробуйте налагодити HikariConfig, HikariConfigurationUtil, HikariCPConnectionProvider, щоб переконатися, що властивості підібрано.
Раф,

26

Ви можете просто скористатися лише 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компонент, вам слід чітко вказати використання 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достатньо.
Michael Piefel

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

1
@JanBodnar:, DataSourceConfigurationякий використовується в автоматичній конфігурації, має конфігурації залежно від того, spring.datasource.typeчи встановлено взагалі. Отже, я маю tomcat-jdbcна своєму шляху до класу, і все ще використовую HikariCP як свій пул. Моє тестування це підтверджує. Можливо, ми тут говоримо про зовсім різні версії Spring Boot.
Michael Piefel

1
@MichaelPiefel Цікаво, що мені вдалося запустити це нормально без виключення за допомогою конфігурації Java лише за допомогою типу DataSourceBuilder.create () ... (com.zaxxer.hikari.HikariDataSource.class). З конфігурацією у файлі yaml у мене це не спрацювало. Тож має бути якийсь улов.
Ян Боднар,

14

Я використовую Spring Boot 2.0.4.RELEASE. 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.poolname=myPool

застосування.имм

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

Це працює для мого завантажувального додатку на випадок, якщо це допоможе. Цей клас повідомляє вам, які властивості шукає об'єкт 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
   }
}

Це є. Це легко перекласти на Java.
Jesús Zazueta

Так, зараз я усвідомлюю, що мені потрібно це зробити, тому що зараз я хочу налаштувати Метрики. І єдиний спосіб, який я бачу, - це за допомогою цього 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>

застосування. властивості

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, доданий частіше за все транзитивною залежністю. Якщо вони присутні в classpath, Spring Boot налаштує джерело даних за допомогою пулу підключень за замовчуванням, який є tomcat. HikariCP буде використовуватися для створення Джерела даних лише у тому випадку, якщо в шляху шляху до класу немає іншого постачальника. є резервна послідовність від tomcat -> до HikariCP -> до Commons DBCP.


1
це було дуже корисно, хоча мені довелося з’ясувати кілька назв властивостей, не згаданих тут, як stringType, щоб налаштувати реквізити джерела даних.
уповноважений 01.03.18

Добре знати, що це допомогло.
Шахід Юсуф

8

Це допоможе кожному, хто хоче налаштувати hikaricp для свого додатка за допомогою весняної автоматичної конфігурації. Для мого проекту я використовую spring boot 2 з hikaricp як пул з'єднань JDBC і mysql як базу даних. Одне, що я не бачив в інших відповідях, - це те, data-source-propertiesщо можна використовувати для встановлення різних властивостей, недоступних на spring.datasource.hikari.*шляху. Це еквівалентно використанню HikariConfigкласу. Для налаштування джерела даних та пулу з'єднань hikaricp для специфічних властивостей mysql я використовував анотацію spring auto configure та такі властивості у файлі 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 на HikariCP. Ми виявили, що Hakari пропонує чудову продуктивність, і багато наших користувачів віддають перевагу йому над Tomcat Pool.


5

Ось і виходить, що майже всі налаштування за замовчуванням для HikariCP працюють для мене, крім кількості підключень до БД. Я встановив це властивість у своєму application.properties:

spring.datasource.maximumPoolSize=20

І Енді Вілкінсон правильний, наскільки я можу сказати, що ви не можете використовувати підхід до налаштування dataSourceClassName для HikariCP з Spring Boot.


2
Я використовував HikariCP деякий час у різних програмах, і до цього часу ніколи не мав жодних проблем. Я використовую підхід HikariConfig, де у вас є всі ваші налаштування у файлі властивостей. Працює, як і очікувалось, із SpringBoot та SpringCore. Я також налаштовую maxPoolSize.
Davi Alves

Це має бути, spring.datasource.maximum-pool-sizeколи ви використовуєте властивості конфігурації spring, інакше maximumPoolSizeце ім'я параметра HikariCP.
sura2k

3

Моє налаштування:
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.

Тепер у вас є шанс визначити власну спеціальну конфігурацію для створення компонента HikariDataSource та заповнити його потрібними властивостями.

ПРИМІТКА :::
публічний клас HikariDataSource розширює HikariConfig

Тобі потрібно

  1. заповнити об’єкт HikariConfig, використовуючи бажані властивості Hikari
  2. ініціалізувати об’єкт HikariDataSource за допомогою об’єкта HikariConfig, переданого як аргумент конструктору.

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

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

Короткий зміст властивостей Hikari DataSource на основі весняного завантаження: -

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 =
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-queries = true
spring.datasource.hikari.jdbc- url =
spring.datasource.hikari.leak-виявлення-поріг =
spring.datasource.hikari.login-timeout = 60
spring.datasource.hikari.max-lifetime =
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-isolation =
spring.datasource.hikari .користувацьке ім'я =
spring.datasource.hikari.validation-timeout =


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

Це була лише
Філіп Діліп

2

З пізнішими версіями весняного завантаження перехід на 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.