我遇到了HikariCP
,我对基准测试感到惊讶,我想尝试它而不是我的默认选择C3P0
,令我惊讶的是,我努力获得configurations
正确的可能是因为配置因您使用的技术堆栈组合而异。
我已经设置Spring Boot
了带有JPA, Web, Security
启动器的项目(使用Spring Initializer)以用作具有连接池PostgreSQL
的数据库。
我已用作构建工具,我想分享以下假设对我有用的东西:HikariCP
Gradle
- Spring Boot Starter JPA(Web 和安全 - 可选)
- Gradle 也可以构建
- 使用数据库(即模式、用户、数据库)运行和设置 PostgreSQL
如果您正在使用,则需要以下内容build.gradle
;如果您正在使用 Maven,则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
那是因为
- 首先 exclude,指示 gradle在下载依赖项
jdbc-tomcat
时排除连接池。spring-boot-starter-data-jpa
这可以通过设置也来实现,spring.datasource.type=com.zaxxer.hikari.HikariDataSource
但是,如果我不需要它,我不想要额外的依赖
- 第二个排除,指示 gradle
hibernate-core
在下载com.zaxxer
依赖项时排除,这是因为hibernate-core
已经下载Spring Boot
,我们不希望最终得到不同的版本。
- 第三个排除,指示 gradle
hibernate-core
在下载hibernate-hikaricp
模块时排除,以使 HikariCPorg.hibernate.hikaricp.internal.HikariCPConnectionProvider
用作连接提供程序而不是弃用com.zaxxer.hikari.hibernate.HikariConnectionProvider
一旦我弄清楚了build.gradle
要保留的内容和不保留的内容,我就准备将配置复制/粘贴datasource
到我的配置application.properties
中,并希望一切都能顺利进行,但事实并非如此,我偶然发现了以下问题
- Spring boot 无法找到数据库详细信息(即 url、驱动程序),因此无法设置 jpa 和 hibernate(因为我没有正确命名属性键值)
- HikariCP 回落到
com.zaxxer.hikari.hibernate.HikariConnectionProvider
- 在指示 Spring 在自动配置 hibernate/jpa 时使用新的连接提供程序之后,HikariCP 失败了,因为它正在寻找一些
key/value
并application.properties
抱怨dataSource, dataSourceClassName, jdbcUrl
. 我不得不调试HikariConfig, HikariConfigurationUtil, HikariCPConnectionProvider
并发现HikariCP
无法找到属性,application.properties
因为它的名称不同。
无论如何,这是我不得不依靠反复试验并确保HikariCP
能够选择属性(即,数据库详细信息的数据源以及池属性)以及 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
(或至少类似)放入 Spring Boot JPA 项目版本(1.5.8)应该像魅力一样工作并连接到您预先配置的数据库(即在我的情况下,它是 PostgreSQL,两者都HikariCP & Spring
从spring.datasource.url
要使用的数据库驱动程序)。
我没有看到创建DataSource
bean 的必要性,那是因为 Spring Boot 只需查看即可为我做所有事情,application.properties
这很整洁。
HikariCP 的 github wiki中的文章展示了如何使用 JPA 设置 Spring Boot,但缺乏解释和细节。
上述两个文件也可作为公共要点https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6