如何在我的应用程序.属性文件中的 Spring Boot 应用程序中配置 HikariCP?

2022-08-31 09:23:34

我正在尝试在我的Spring Boot(1.2.0.M1)应用程序中设置HikariCP,以便我可以测试使用它来代替Tomcat DBCP。我想在我的 application.properties 文件中配置连接池,就像我对 Tomcat 所做的那样,但我不知道我应该如何做。我找到的所有示例都显示了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);
    }

}

应用程序.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. Configure application.yml

应用程序.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 :)


答案 2

我遇到了,我对基准测试感到惊讶,我想尝试它而不是我的默认选择,令我惊讶的是,我很难获得正确的配置,可能是因为配置根据您使用的技术堆栈组合而有所不同。HikariCPC3P0configurations

我设置了带有初学者(使用Spring Initializer)的项目,以用作数据库并用作连接池。
我已用作构建工具,我想分享以下假设对我有用的方法:Spring BootJPA, Web, SecurityPostgreSQLHikariCPGradle

  1. Spring Boot Starter JPA (Web & Security - optional)
  2. Gradle build too
  3. PostgreSQL使用数据库(即schema,user,db)运行和设置

如果您正在使用,则需要以下内容,或者如果您使用的是maven,则需要等效的build.gradleGradlepom.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. 首先排除,指示在下载依赖项时排除连接池的 gradle。这可以通过设置来实现,但是,如果我不需要它,我不想要额外的依赖关系jdbc-tomcatspring-boot-starter-data-jpaspring.datasource.type=com.zaxxer.hikari.HikariDataSource
  2. 第二个排除,指示 gradle 在下载依赖项时排除,这是因为已经下载了,我们不想以不同的版本结束。hibernate-corecom.zaxxerhibernate-coreSpring Boot
  3. 第三个排除,指示 gradle 在下载模块时排除,这是为了使 HikariCP 用作连接提供程序而不是弃用的模块所必需的hibernate-corehibernate-hikaricporg.hibernate.hikaricp.internal.HikariCPConnectionProvidercom.zaxxer.hikari.hibernate.HikariConnectionProvider

一旦我弄清楚了保留什么和不保留什么,我准备将配置复制/粘贴到我的配置中,并期望所有内容都能以出色的颜色工作,但是,不是真的,我偶然发现了以下问题build.gradledatasourceapplication.properties

  • Spring boot无法找到数据库详细信息(即url,驱动程序),因此无法设置jpa和休眠(因为我没有正确命名属性键值)
  • HikariCP 回落到com.zaxxer.hikari.hibernate.HikariConnectionProvider
  • 在指示Spring在自动配置hibernate/jpa时使用新的连接提供程序后,HikariCP失败了,因为它正在寻找一些,并且抱怨。我不得不调试并发现无法从中找到属性,因为它的名称不同。key/valueapplication.propertiesdataSource, dataSourceClassName, jdbcUrlHikariConfig, HikariConfigurationUtil, HikariCPConnectionProviderHikariCPapplication.properties

无论如何,这是我必须依靠反复试验的地方,并确保能够选择属性(即数据库详细信息的数据源,以及池化属性)以及Sping Boot按预期运行,我最终得到了以下文件。HikariCPapplication.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 使用新的 HibernateConnectionProvisionProider)
  • spring.jpa.properties.hibernate.x(Spring用于自动配置JPA,用下划线记下字段名称)

很难遇到一个教程或帖子或一些资源来显示如何使用上述属性文件以及如何命名属性。好吧,你有它。

将上述内容与(或至少相似)放入Spring Boot JPA项目版本(1.5.8)中应该像魅力一样工作并连接到预配置的数据库(即,在我的情况下,它是PostgreSQL,两者都从要使用的数据库驱动程序中找出)。application.propertiesbuild.gradleHikariCP & Springspring.datasource.url

我没有看到创造豆子的必要性,那是因为Spring Boot能够通过观察为我做任何事情,这很整洁。DataSourceapplication.properties

HikariCP的github wiki的文章展示了如何使用JPA设置Spring Boot,但缺乏解释和细节。

上述两个文件也可用作公共要点 https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6


推荐