我遇到了,我对基准测试感到惊讶,我想尝试它而不是我的默认选择,令我惊讶的是,我很难获得正确的配置,可能是因为配置根据您使用的技术堆栈组合而有所不同。HikariCP
C3P0
configurations
我设置了带有初学者(使用Spring Initializer)的项目,以用作数据库并用作连接池。
我已用作构建工具,我想分享以下假设对我有用的方法:Spring Boot
JPA, Web, Security
PostgreSQL
HikariCP
Gradle
- Spring Boot Starter JPA (Web & Security - optional)
- Gradle build too
- PostgreSQL使用数据库(即schema,user,db)运行和设置
如果您正在使用,则需要以下内容,或者如果您使用的是maven,则需要等效的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
- 首先排除,指示在下载依赖项时排除连接池的 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 在下载模块时排除,这是为了使 HikariCP 用作连接提供程序而不是弃用的模块所必需的
hibernate-core
hibernate-hikaricp
org.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在自动配置hibernate/jpa时使用新的连接提供程序后,HikariCP失败了,因为它正在寻找一些,并且抱怨。我不得不调试并发现无法从中找到属性,因为它的名称不同。
key/value
application.properties
dataSource, dataSourceClassName, jdbcUrl
HikariConfig, HikariConfigurationUtil, HikariCPConnectionProvider
HikariCP
application.properties
无论如何,这是我必须依靠反复试验的地方,并确保能够选择属性(即数据库详细信息的数据源,以及池化属性)以及Sping Boot按预期运行,我最终得到了以下文件。HikariCP
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 使用新的 HibernateConnectionProvisionProider)
-
spring.jpa.properties.hibernate.x(Spring用于自动配置JPA,用下划线记下字段名称)
很难遇到一个教程或帖子或一些资源来显示如何使用上述属性文件以及如何命名属性。好吧,你有它。
将上述内容与(或至少相似)放入Spring Boot JPA项目版本(1.5.8)中应该像魅力一样工作并连接到预配置的数据库(即,在我的情况下,它是PostgreSQL,两者都从要使用的数据库驱动程序中找出)。application.properties
build.gradle
HikariCP & Spring
spring.datasource.url
我没有看到创造豆子的必要性,那是因为Spring Boot能够通过观察为我做任何事情,这很整洁。DataSource
application.properties
HikariCP的github wiki中的文章展示了如何使用JPA设置Spring Boot,但缺乏解释和细节。
上述两个文件也可用作公共要点 https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6