복붙노트

[SPRING] application.properties 파일의 Spring Boot app에 HikariCP를 어떻게 구성합니까?

SPRING

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

내 봄 부팅 (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

해결법

  1. ==============================

    1.

    @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
    

    업데이트 됨! 버전 봄 부팅 1.3.0 이후 :

    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 부트 2.0.0 이후 버전 :

    기본 연결 풀이 Tomcat에서 Hikari로 변경되었습니다. :)

  2. ==============================

    2.단순히 application.yml / application.properties 만 사용할 수 있습니다. DataSource Bean를 명시 적으로 작성할 필요는 없습니다.

    단순히 application.yml / application.properties 만 사용할 수 있습니다. DataSource Bean를 명시 적으로 작성할 필요는 없습니다.

    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>
    

    DataSource bean을 만들지 않으므로, 명시 적으로 히가시를 사용하여 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에서 spring.datasource.hikari. *에서 풀 크기 등과 같은 히카리 특정 매개 변수를 구성 할 수 있습니다.

  3. ==============================

    3.나는 HikariCP를 보았고 나는 벤치 마크에 놀랐다. 나는 C3P0 대신에 그것을 시험해보고 싶었다. 놀랍게도 설정은 아마도 당신이 사용하고있는 기술 스택의 조합에 따라 다르니까 아마 설정을 제대로하지 못했다.

    나는 HikariCP를 보았고 나는 벤치 마크에 놀랐다. 나는 C3P0 대신에 그것을 시험해보고 싶었다. 놀랍게도 설정은 아마도 당신이 사용하고있는 기술 스택의 조합에 따라 다르니까 아마 설정을 제대로하지 못했다.

    JPA, 웹, 보안 스타터 (Spring Initializer 사용)와 함께 Spring 부트 프로젝트를 설정하여 연결 풀링으로 HikariCP가있는 데이터베이스로 PostgreSQL을 사용합니다. 저는 Gradle을 빌드 도구로 사용했으며 다음과 같은 가정을 위해 저에게 효과가 있었던 것을 공유하고 싶습니다.

    maven을 사용하는 경우 Gradle 또는 이와 동등한 pom.xml을 사용하는 경우 다음 build.gradle이 필요합니다.

    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에는 여러 제외 항목이 있으며 이는

    일단 build.gradle과 무엇을 유지해야하는지, 그리고 무엇을 유지할 것인지를 알게되면 데이터 소스 구성을 내 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 
    

    위에 표시된 것처럼 구성은 다음 이름 지정 패턴을 기반으로 범주로 나뉩니다

    튜토리얼이나 게시물 또는 위의 특성 파일이 사용되는 방법과 특성을 명명하는 방법을 보여주는 자원을 찾기가 어렵습니다. 음, 거기 있었 군.

    위의 application.properties를 build.gradle (또는 적어도 비슷한 것)으로 스프링 부트 JPA 프로젝트 버전 (1.5.8)에 던지면 매력처럼 작동하고 미리 구성된 데이터베이스에 연결해야한다. (예 : 내 경우 PostgreSQL이다. HikariCP & Spring은 spring.datasource.url에서 데이터베이스 드라이버를 사용할 위치를 결정합니다.)

    스프링 부트는 application.properties를 살펴봄으로써 나에게 모든 것을 할 수 있기 때문에 DataSource 빈을 생성 할 필요가 없다는 것을 알았다.

    HikariCP의 github 위키에있는 기사에서는 JPA로 스프링 부트를 설정하는 방법을 보여 주지만 설명과 세부 사항은 부족합니다.

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

  4. ==============================

    4.속성 값을 변수에 넣기 위해 중복 코드가 필요하지 않습니다. 특성 파일로 특성을 직접 설정할 수 있습니다.

    속성 값을 변수에 넣기 위해 중복 코드가 필요하지 않습니다. 특성 파일로 특성을 직접 설정할 수 있습니다.

    hikari.properties 파일을 classpath에 넣으십시오.

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

    그리고 이런 데이터 소스 빈을 만든다.

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

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

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

    https://github.com/brettwooldridge/HikariCP/blob/2.3.x/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java

    여러 datasources 소스 config 파일의 속성 키에 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
       }
    }
    
  6. ==============================

    6.@Andy Wilkinson이 말한 것처럼 application.properties 구성에서 dataSourceClassName 접근 방식을 사용할 수 없습니다. 어쨌든 dataSourceClassName을 원하면 Java Config를 다음과 같이 사용할 수 있습니다.

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

    dataSourceClassName은 throw 할 것이고 예외이기 때문에 사용할 수없는 이유

    Caused by: java.lang.IllegalStateException: both driverClassName and dataSourceClassName are specified, one or the other should be used.
    

    이는 spring.datasource.url 속성에서 Spring boot를 의미하고 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이라는 기본 연결 풀을 사용하여 Datasource를 설정합니다. HikariCP는 classpath에 다른 공급자가없는 경우에만 데이터 소스를 만드는 데 사용됩니다. tomcat ->에서 HikariCP -> Commons DBCP로 대체 시퀀스가 ​​있습니다.

  7. ==============================

    7.dataSourceClassName 접근법을 사용할 수 있습니다. 여기에 MySQL의 예제가 있습니다. (봄 부팅 1.3 및 1.4로 테스트 됨)

    dataSourceClassName 접근법을 사용할 수 있습니다. 여기에 MySQL의 예제가 있습니다. (봄 부팅 1.3 및 1.4로 테스트 됨)

    먼저 tomcat-jdbc를 hikaricp를 위해 선택 될 때 classpath에서 제외해야합니다.

    Pom.hml

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

    8.여기에 좋은 소식이 있습니다. HikariCP는 현재 스프링 부트 2.0.0이있는 기본 연결 풀입니다.

    여기에 좋은 소식이 있습니다. HikariCP는 현재 스프링 부트 2.0.0이있는 기본 연결 풀입니다.

    스프링 부트 2.0.0 릴리스 노트

  9. ==============================

    9.그래서 HikariCP의 거의 모든 기본 설정이 DB 연결 수를 제외하고 나에게 효과가있는 것으로 나타났습니다. 내 application.properties에 그 속성을 설정했습니다 :

    그래서 HikariCP의 거의 모든 기본 설정이 DB 연결 수를 제외하고 나에게 효과가있는 것으로 나타났습니다. 내 application.properties에 그 속성을 설정했습니다 :

    spring.datasource.maximumPoolSize=20
    

    Andy Wilkinson은 Spring Boot가있는 HikariCP에 대해 dataSourceClassName 구성 접근법을 사용할 수 없다는 점에서 제가 말할 수있는 한 정확합니다.

  10. ==============================

    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
    

    다음은 히카리에서 수행 할 수있는 다음과 같은 구성 변경입니다. 필요에 따라 추가 / 업데이트하십시오.

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

    11.나는 Spring Boot 2.0.4를 사용하고있다. 히카리는 기본 연결 풀이며 .hikari는 더 이상 필요하지 않습니다.

    나는 Spring Boot 2.0.4를 사용하고있다. 히카리는 기본 연결 풀이며 .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
    

    그리고 구성은 HikariConfig를 확장 할 필요가 없으며 이전과 같이 DataSourceBuilder를 사용할 수 있습니다.

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

    12.최신 봄 부팅 릴리스에서는 히카리로의 전환이 완전히 구성 될 수 있습니다. 나는 1.5.6.RELEASE를 사용하고 있으며이 방법이 효과적이다.

    최신 봄 부팅 릴리스에서는 히카리로의 전환이 완전히 구성 될 수 있습니다. 나는 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
    

    기본 DB에 맞게 connectionTestQuery를 변경하십시오. 그게 다야, 코드는 필요 없다.

  13. ==============================

    13.내 설정 : 봄 부팅 v1.5.10 히카리 v.3.2.x (평가 용)

    내 설정 : 봄 부팅 v1.5.10 히카리 v.3.2.x (평가 용)

    히카리 데이터 소스의 설정을 이해하기 위해서는 데이터 소스에 대한 스프링 부트의 자동 설정을 비활성화하는 것이 좋습니다.

    application.properties에 다음을 추가하십시오 .-

    이렇게하면 스프링 부트가 데이터 소스를 독자적으로 구성 할 수 없게됩니다.

    이제 HikariDataSource bean을 만들고 원하는 속성으로 채우기 위해 자신 만의 Custom Configuration을 정의 할 수있는 기회입니다.

    너는 ~해야 해.

    Hikari DataSource 등록 정보의 봄 부팅 요약

  14. from https://stackoverflow.com/questions/26490967/how-do-i-configure-hikaricp-in-my-spring-boot-app-in-my-application-properties-f by cc-by-sa and MIT license