[SPRING] application.properties 파일의 Spring Boot app에 HikariCP를 어떻게 구성합니까?
SPRINGapplication.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.
@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.단순히 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.나는 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.속성 값을 변수에 넣기 위해 중복 코드가 필요하지 않습니다. 특성 파일로 특성을 직접 설정할 수 있습니다.
속성 값을 변수에 넣기 위해 중복 코드가 필요하지 않습니다. 특성 파일로 특성을 직접 설정할 수 있습니다.
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.도움이 될 경우 내 부팅 응용 프로그램에서 작동합니다. 이 클래스는 설정 객체가 찾고있는 속성을 알려줍니다 :
도움이 될 경우 내 부팅 응용 프로그램에서 작동합니다. 이 클래스는 설정 객체가 찾고있는 속성을 알려줍니다 :
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.@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.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.여기에 좋은 소식이 있습니다. HikariCP는 현재 스프링 부트 2.0.0이있는 기본 연결 풀입니다.
여기에 좋은 소식이 있습니다. HikariCP는 현재 스프링 부트 2.0.0이있는 기본 연결 풀입니다.
스프링 부트 2.0.0 릴리스 노트
-
==============================
9.그래서 HikariCP의 거의 모든 기본 설정이 DB 연결 수를 제외하고 나에게 효과가있는 것으로 나타났습니다. 내 application.properties에 그 속성을 설정했습니다 :
그래서 HikariCP의 거의 모든 기본 설정이 DB 연결 수를 제외하고 나에게 효과가있는 것으로 나타났습니다. 내 application.properties에 그 속성을 설정했습니다 :
spring.datasource.maximumPoolSize=20
Andy Wilkinson은 Spring Boot가있는 HikariCP에 대해 dataSourceClassName 구성 접근법을 사용할 수 없다는 점에서 제가 말할 수있는 한 정확합니다.
-
==============================
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.나는 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.최신 봄 부팅 릴리스에서는 히카리로의 전환이 완전히 구성 될 수 있습니다. 나는 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.내 설정 : 봄 부팅 v1.5.10 히카리 v.3.2.x (평가 용)
내 설정 : 봄 부팅 v1.5.10 히카리 v.3.2.x (평가 용)
히카리 데이터 소스의 설정을 이해하기 위해서는 데이터 소스에 대한 스프링 부트의 자동 설정을 비활성화하는 것이 좋습니다.
application.properties에 다음을 추가하십시오 .-
이렇게하면 스프링 부트가 데이터 소스를 독자적으로 구성 할 수 없게됩니다.
이제 HikariDataSource bean을 만들고 원하는 속성으로 채우기 위해 자신 만의 Custom Configuration을 정의 할 수있는 기회입니다.
너는 ~해야 해.
Hikari DataSource 등록 정보의 봄 부팅 요약
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
'SPRING' 카테고리의 다른 글
[SPRING] Spring - POST 후에 리디렉션 (유효성 검사 오류가있는 경우에도) (0) | 2018.12.05 |
---|---|
[SPRING] 왜 우리는 봄에 정적 필드를 autowire 수없는거야? (0) | 2018.12.05 |
[SPRING] 어쨌든 생성자 인수가 필요한 빈을 @Autowire로 보내려면? (0) | 2018.12.05 |
[SPRING] 스프링 부트, 스프링 데이터 JPA 여러 데이터 소스 포함 (0) | 2018.12.05 |
[SPRING] 범위 '세션'이 현재 스레드에 대해 활성화되어 있지 않습니다. IllegalStateException : 스레드 바인딩 된 요청이 없습니다. (0) | 2018.12.05 |