我遇到HikariCP
了这些测试,我对基准感到惊讶,我想尝试一下它而不是默认选择C3P0
,但令我惊讶的是,我努力地找到了configurations
正确的选择,可能是因为配置因所使用的技术堆栈的组合而异。
我有Spring Boot
一个带有JPA, Web, Security
启动程序的安装项目(使用Spring Initializer),可以PostgreSQL
用作带有HikariCP
连接池的数据库。
我已将其用作Gradle
构建工具,并且我想分享以下假设对我有用的内容:
- Spring Boot Starter JPA(网络和安全性-可选)
- Gradle构建也
- PostgreSQL运行并通过数据库(即模式,用户,数据库)进行设置
你需要以下build.gradle
如果您正在使用Gradle
或同等pom.xml
如果你正在使用maven
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')
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')
compile('com.zaxxer:HikariCP:2.5.1') {
exclude group: 'org.hibernate', module: 'hibernate-core'
}
compile('org.hibernate:hibernate-hikaricp:5.2.11.Final') {
exclude group: 'com.zaxxer', module: 'HikariCP'
exclude group: 'org.hibernate', module: 'hibernate-core'
}
}
上面有很多排除项build.gradle
,这是因为
- 首先排除,指示gradle
jdbc-tomcat
在下载spring-boot-starter-data-jpa
依赖项时排除连接池。这可以通过设置Also来实现,spring.datasource.type=com.zaxxer.hikari.HikariDataSource
但是,如果不需要,我不需要额外的依赖关系
- 第二个排除项,指示gradle
hibernate-core
在下载com.zaxxer
依赖项时进行排除,这是因为hibernate-core
已经下载了依赖项,Spring Boot
并且我们不希望最终使用其他版本。
- 第三排除,
hibernate-core
在下载hibernate-hikaricp
模块时指示gradle排除,以使HikariCPorg.hibernate.hikaricp.internal.HikariCPConnectionProvider
用作连接提供者而不是不推荐使用com.zaxxer.hikari.hibernate.HikariConnectionProvider
一旦弄清楚了build.gradle
要保留的内容和不应该保留的内容,就可以将datasource
配置复制/粘贴到我的文件中,application.properties
并期望所有内容都可以正常工作,但实际上并没有,我偶然发现了以下问题
- Spring Boot无法找出数据库详细信息(即url,驱动程序),因此无法设置jpa和休眠状态(因为我没有正确命名属性键值)
- HikariCP回落到
com.zaxxer.hikari.hibernate.HikariConnectionProvider
- 后指示Spring使用新的连接提供商时自动配置休眠/ JPA然后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:
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