내 application.properties 파일의 Spring Boot 앱에서 HikariCP를 어떻게 구성합니까?


92

Spring Boot (1.2.0.M1) 앱에서 HikariCP를 설정하여 Tomcat DBCP 대신 사용하여 테스트 할 수 있습니다. Tomcat에서했던 것처럼 application.properties 파일에서 연결 풀을 구성하고 싶지만 어떻게해야하는지 알 수 없습니다. 내가 찾은 모든 예제는 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 hikariCP에 대한 maximumPoolSize와 같은 것을 설정하기 위해 속성을 설정하는 방법을 알아 낸 것 같습니다. 그러나 driverClassName 및 jdbc url 대신 dataSourceClassName 및 serverName을 사용하여 hikariCP 권장 방식을 사용하여 구성을 작동시킬 수 없었습니다. 그래서 그 부분을 포기했습니다. 누군가 그 부분을 알아낼 수 있다면 도움이 될 것입니다
Kevin M

나는 나중에 1.2.0.M1을 시도해 볼 것이다. 그리고 나는 그것을 게시 할 것이 무엇이든 알아낼 것이다
geoand

2
spring.datasource.url이 설정되어야하므로 Spring Boot의 DataSource 자동 구성과 함께 dataSourceClassName 접근 방식을 사용할 수 없습니다. Boot가 jdbcUrl에서 추론하므로 driverClassName을 지정할 필요가 없습니다.
Andy Wilkinson

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
나는 이것이 훨씬 더 좋고 더 이식 가능한 접근 방식이라고 생각합니다. 건배!
Jesús Zazueta 2015 년

2
이것은 표준 스프링 구성에도 사용할 수 있지만 중요하다고 생각합니다. Hikari는 jdbcUrl을 통해 데이터 소스의 URL을 사용했지만 URL을 통해 봄. {개인 문자열 URL; @Bean public DataSource dataSource () throws SQLException {return new HikariDataSource (this); } public String getUrl () {return url; } public void setUrl (String url) {this.url = url; // HikariConfig는 jdbcUrl 속성에 JDBC-URL을 포함하지만 spring은이 속성을 url로 제공합니다. this.setJdbcUrl (url); }}
Tomas Hanus 2015

죄송합니다. 답변이 조금 늦었지만 모든 속성을 얻으려면 @Sergey 솔루션을 약간 변경해야합니다. hikari 특정 DS 속성을 가져 오려면 키를 "spring.datasource.hikari"대신 "spring.datasource. dataSourceProperties"로 설정해야합니다
bluelabel

3
이전에는 데이터 소스의 문서를보고 어떻게 구성되어 있는지 확인해야했지만 이제는 더 나빠졌습니다. 이제 Spring Boot를 사용할 때 구성 방법도 알아야합니다. 이 automagic 구성이 정말 도움이되는 것 같지는 않습니다.
supertonsky

31

나는 마주 HikariCP쳤고 벤치 마크에 놀랐고 기본 선택 대신 사용해보고 싶었고 C3P0놀랍게도 configurations사용중인 기술 스택의 조합에 따라 구성이 다르기 때문에 올바른 것을 얻기 위해 고군분투 했습니다.

연결 풀링 과 함께 데이터베이스 로 사용할 스타터 ( Spring Initializer 사용) 가있는 설정 Spring Boot프로젝트가 있습니다. 나는 빌드 도구로 사용 했으며 다음 가정에서 나를 위해 일한 것을 공유하고 싶습니다.JPA, Web, SecurityPostgreSQLHikariCP
Gradle

  1. Spring Boot Starter JPA (웹 및 보안-선택 사항)
  2. Gradle 빌드도
  3. 데이터베이스 (예 : 스키마, 사용자, db)를 사용하여 PostgreSQL 실행 및 설정

다음이 필요합니다 build.gradle당신이 사용하는 경우 Gradle또는 이에 상응하는 pom.xml당신이 받는다는을 사용하는 경우

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. 먼저 제외, 종속성을 jdbc-tomcat다운로드 할 때 연결 풀 을 제외하도록 gradle에 지시 합니다 spring-boot-starter-data-jpa. 이것은 spring.datasource.type=com.zaxxer.hikari.HikariDataSource또한 설정하여 얻을 수 있지만 필요하지 않으면 추가 종속성을 원하지 않습니다.
  2. 두 번째 제외는 종속 hibernate-core항목을 다운로드 할 때 제외하도록 gradle에 지시합니다. com.zaxxer이는 hibernate-core이미에 의해 다운로드되었으며 Spring Boot다른 버전으로 끝나고 싶지 않기 때문 입니다 .
  3. 세 번째 제외, HikariCP 가 더 이상 사용되지 않는 대신 연결 공급자로 사용되도록하기 위해 필요한 모듈을 hibernate-core다운로드 할 때 제외하도록 gradle에 지시합니다.hibernate-hikaricporg.hibernate.hikaricp.internal.HikariCPConnectionProvidercom.zaxxer.hikari.hibernate.HikariConnectionProvider

일단 내가 build.gradle무엇을, 무엇을 유지하고, 무엇을하지 말아야하는지 알아 내자 , datasource구성 을 복사 / 붙여 넣기 할 준비가되었고 application.properties모든 것이 플라잉 컬러로 작동 할 것으로 예상했지만 실제로는 아니 었고 다음 문제를 발견했습니다.

  • 스프링 부트가 데이터베이스 세부 정보 (예 : URL, 드라이버)를 찾지 못해 jpa 및 최대 절전 모드를 설정할 수 없습니다 (속성 키 값의 이름을 올바르게 지정하지 않았기 때문에)
  • HikariCP가 com.zaxxer.hikari.hibernate.HikariConnectionProvider
  • Hibernate / jpa를 자동 구성 할 때 새로운 연결 제공자를 사용하도록 Spring에 지시 한 후 HikariCP는에서 일부 key/value를 찾고 application.properties불평 했기 때문에 실패했습니다 dataSource, dataSourceClassName, jdbcUrl. 나는 디버깅해야 HikariConfig, HikariConfigurationUtil, HikariCPConnectionProvider했고 이름이 다르기 때문에 HikariCP속성을 찾을 수 없다는 것을 알았습니다 application.properties.

어쨌든 이것은 시행 착오에 의존 HikariCP하고 속성 (즉, db 세부 정보 인 데이터 소스 및 풀링 속성)을 선택할 수 있는지 확인하고 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.propertiesbuild.gradle(또는 이와 유사한 이상) 스프링 부팅 JPA 프로젝트 버전 (1.5.8)로하면 마법처럼 작동하고 사전 구성된 데이터베이스에 연결해야합니다 (즉, 내 경우 그것의 PostgreSQL의에서 그 모두 HikariCP & Spring로부터 파악 spring.datasource.url되는에 사용할 데이터베이스 드라이버).

나는 DataSource빈 을 생성 할 필요성을 보지 못했고 그것은 Spring Boot가 단지 들여다보기 application.properties만해도 나를 위해 모든 것을 할 수 있고 그것은 깔끔하기 때문이다.

기사 HikariCP의 GitHub의의의 위키 설정하는 방법 봄 JPA로 부팅 만에 쇼 설명과 세부 사항이 부족하다.

위의 두 파일은 https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6 공개 요점으로도 사용할 수 있습니다.


나는 당신이 게시하기 직전에 이것으로 어려움을 겪었습니다. 감사합니다!
Bogdan Pușcașu

도움이되었다 니 다행입니다! 👍
Raf

Raf 당신은 멋진 대답을 가지고 있습니다. Spring Boot 2.0.0.M6에 필요한 변경 사항을 게시 할 수 있는지 궁금했습니다. 구성이 선택되지 않고 마이그레이션 가이드가 아직 업데이트되지 않은 문제로 어려움을 겪고 있습니다.
Matthew Fontana

Hey Mat, 여기에서 솔루션을 공유 할 때 1.5.8 Release를 사용하고있었습니다. 2.0.0.M6에 빠른 시도를하고 싶었지만 불행히도 더 높은 버전의 gradle이 필요합니다. 2.0.0.M6에서 기억할 수있는 유일한 변경 사항은 Spring jpa에 대한 HikariCP 기본 연결 풀링을 만드는 것입니다. 여기를 참조하십시오. github.com/spring-projects/spring-boot/commit/… HikariConfig, HikariConfigurationUtil, HikariCPConnectionProvider를 디버깅하여 확인하십시오. 속성이 선택됩니다.
Raf 2011

26

application.yml / application.properties 만 사용할 수 있습니다. 명시 적으로 DataSourceBean을 생성 할 필요가 없습니다.

ydemartino가 언급 한대로 tomcat-jdbc를 제외해야합니다.

<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을 생성하지 않기 때문에 application.yml / application.properties의 spring.datasource.typecom.zaxxer.hikari.HikariDataSource을 통해 Hikari 사용을 명시 적으로 지정해야 합니다.

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에서 순서대로). 내 테스트가 이것을 확인합니다.
Jan Bodnar 2017

1
@JanBodnar : DataSourceConfiguration자동 구성에 사용 되는는 설정 여부에 따라 구성 spring.datasource.type이 있습니다. 그래서 나는 tomcat-jdbc내 클래스 경로에 있고 여전히 HikariCP를 내 풀로 사용합니다. 내 테스트가 이것을 확인합니다. 아마도 우리는 여기서 매우 다른 Spring Boot 버전에 대해 이야기하고있을 것입니다.
Michael Piefel 2017-04-12

1
@MichaelPiefel 흥미롭게도 DataSourceBuilder.create () ... type (com.zaxxer.hikari.HikariDataSource.class) 만 사용하여 Java 구성을 제외하지 않고 정상적으로 실행할 수있었습니다. yaml 파일의 구성으로 인해 작동하지 않았습니다. 그래서 약간의 캐치가 있어야합니다.
Jan Bodnar 2017

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로 쉽게 번역 할 수 있습니다.
Jesús Zazueta 2015

예, 이제 메트릭을 구성하고 싶기 때문에이 작업을 수행해야한다는 것을 깨달았습니다. 이를 수행하는 유일한 방법은이 JavaConfig를 사용하여 자동 구성을 재정의하는 것입니다. 감사.
Kevin M

예, 도움이됩니다! 당신도 내 반대표를 얻습니다. 그것은, 그것은 :-) 자바 스크립트와 같은 매우 흥미로운 것
주앙 폴로

8

dataSourceClassName 접근 방식을 사용할 수 있습니다. 여기에 MySQL의 예가 있습니다. (스프링 부트 1.3 및 1.4로 테스트 됨)

먼저 hikaricp를 선호하는 클래스 경로에서 tomcat-jdbc를 제외해야합니다.

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

@Andy Wilkinson이 말한 것처럼 application.properties 구성에서 dataSourceClassName 접근 방식을 사용할 수 없습니다. 어쨌든 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;
   }
  } 

throw 및 예외가 발생하기 때문에 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

도움이되었다 니 다행입니다.
Shahid Yousuf

8

이것은 스프링 자동 구성을 사용하여 애플리케이션에 대해 hikaricp를 구성하려는 모든 사람에게 도움이 될 것입니다. 내 프로젝트의 경우 JDBC 연결 풀로 hikaricp와 데이터베이스로 mysql을 사용하는 스프링 부트 2를 사용합니다. 다른 답변에서 보지 못한 한 가지는 경로 data-source-properties에서 사용할 수없는 다양한 속성을 설정하는 데 사용할 수 있다는 것 spring.datasource.hikari.*입니다. 이것은 HikariConfig클래스 를 사용하는 것과 같습니다 . mysql 특정 속성에 대한 데이터 소스 및 hikaricp 연결 풀을 구성하기 위해 스프링 자동 구성 주석과 application.yml 파일의 다음 속성을 사용했습니다.

장소 @EnableAutoConfiguration구성 콩 파일 중 하나에.

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

이 답변은 data-source-properties에 대한 작업 예제를 제공하는 데 유용합니다!
Mauro Molinari

6

여기에 좋은 소식이 있습니다. HikariCP는 이제 Spring Boot 2.0.0에서 기본 연결 풀입니다.

Spring Boot 2.0.0 릴리스 정보

Spring Boot 2.0의 기본 데이터베이스 풀링 기술은 Tomcat Pool에서 HikariCP로 전환되었습니다. Hakari는 우수한 성능을 제공하며 많은 사용자가 Tomcat Pool보다 선호하는 것으로 나타났습니다.


5

따라서 HikariCP의 거의 모든 기본 설정이 DB 연결 수를 제외하고는 저에게 효과적이라는 것이 밝혀졌습니다. 내 application.properties에서 해당 속성을 설정했습니다.

spring.datasource.maximumPoolSize=20

그리고 Andy Wilkinson은 Spring Boot에서 HikariCP에 대한 dataSourceClassName 구성 접근 방식을 사용할 수 없다는 점에서 옳습니다.


2
나는 다른 응용 프로그램에서 한동안 HikariCP를 사용해 왔으며 지금까지 아무런 문제가 없었습니다. 속성 파일에 모든 구성이있는 HikariConfig 접근 방식을 사용하고 있습니다. SpringBoot 및 SpringCore에서도 예상대로 작동합니다. 또한 maximumPoolSize를 구성하고 있습니다.
Davi Alves

spring.datasource.maximum-pool-size스프링 구성 속성을 사용할 때 여야하며 , 그렇지 않으면 maximumPoolSizeHikariCP 매개 변수 이름입니다.
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

이것은 자체적으로 DataSource를 구성하는 Spring Boot의 기능을 비활성화합니다.

이제 HikariDataSource 빈을 만들고 원하는 속성으로 채우기 위해 사용자 지정 구성을 정의 할 수 있습니다.

참고 :::
공용 클래스 HikariDataSource는 HikariConfig를 확장합니다.

당신은

  1. 원하는 Hikari 속성을 사용하여 HikariConfig 개체 채우기
  2. 생성자에 인수로 전달 된 HikariConfig 객체로 HikariDataSource 객체를 초기화합니다.

내 자신의 사용자 지정 구성 클래스 (@Configuration) 를 정의 하여 데이터 소스를 직접 만들고 별도의 파일 (기존 : application.properties보다)에 정의 된 데이터 소스 속성으로 채우는 것이 좋습니다

. 이런 방식으로 직접 정의 할 수 있습니다. Hibernate를 사용하는 sessionFactory Bean은 "LocalSessionFactoryBean"클래스를 권장하고 Hikari 데이터 소스> 및 기타 Hiberante-JPA 기반 속성으로 채 웁니다.

Spring Boot 기반 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-detection-threshold =
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 .username =
spring.datasource.hikari.validation-timeout =


spring.datasource.hikari.maximum-pool-size = 500 정말 끔찍하고 hikari
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기본 DB에 맞게 변경하십시오 . 코드가 필요하지 않습니다.


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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.