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 이후 :
- HikariCP를 종속성에 추가하기 만하면됩니다.
- 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, Security
PostgreSQL
HikariCP
Gradle
- Spring Boot Starter JPA (웹 및 보안-선택 사항)
- Gradle 빌드도
- 데이터베이스 (예 : 스키마, 사용자, 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
그 때문에이
- 먼저 제외, 종속성을
jdbc-tomcat
다운로드 할 때 연결 풀 을 제외하도록 gradle에 지시 합니다spring-boot-starter-data-jpa
. 이것은spring.datasource.type=com.zaxxer.hikari.HikariDataSource
또한 설정하여 얻을 수 있지만 필요하지 않으면 추가 종속성을 원하지 않습니다. - 두 번째 제외는 종속
hibernate-core
항목을 다운로드 할 때 제외하도록 gradle에 지시합니다.com.zaxxer
이는hibernate-core
이미에 의해 다운로드되었으며Spring Boot
다른 버전으로 끝나고 싶지 않기 때문 입니다 . - 세 번째 제외, HikariCP 가 더 이상 사용되지 않는 대신 연결 공급자로 사용되도록하기 위해 필요한 모듈을
hibernate-core
다운로드 할 때 제외하도록 gradle에 지시합니다.hibernate-hikaricp
org.hibernate.hikaricp.internal.HikariCPConnectionProvider
com.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.properties
와 build.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 만 사용할 수 있습니다. 명시 적으로 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을 생성하지 않기 때문에 application.yml / application.properties의 spring.datasource.type
값 com.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;
}
답변
이것은 도움이 될 경우 내 부팅 응용 프로그램에서 작동합니다. 이 클래스는 구성 개체가 찾고있는 속성을 알려줍니다.
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
}
}