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

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



답변

@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로 변경되었습니다. 🙂


답변

나는 마주 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 공개 요점으로도 사용할 수 있습니다.


답변

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.*


답변

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


답변

문서에 따르면 변경되었습니다.

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


답변

변수에 속성 ​​값을 입력하기 위해 중복 코드가 필요하지 않습니다. 속성 파일을 사용하여 직접 속성을 설정할 수 있습니다.

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


답변

이것은 도움이 될 경우 내 부팅 응용 프로그램에서 작동합니다. 이 클래스는 구성 개체가 찾고있는 속성을 알려줍니다.

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