ฉันพบHikariCP
และรู้สึกประหลาดใจกับเกณฑ์มาตรฐานและฉันต้องการลองใช้แทนตัวเลือกเริ่มต้นของฉันC3P0
และฉันประหลาดใจที่ฉันพยายามดิ้นรนเพื่อให้ได้สิ่งที่configurations
ถูกต้องอาจเป็นเพราะการกำหนดค่าแตกต่างกันไปขึ้นอยู่กับการผสมผสานของเทคโนโลยีที่คุณใช้
ฉันมีการตั้งค่าSpring Boot
โปรเจ็กต์พร้อมJPA, Web, Security
starters (โดยใช้Spring Initializer ) เพื่อใช้PostgreSQL
เป็นฐานข้อมูลพร้อมกับHikariCP
การเชื่อมต่อ
ฉันใช้Gradle
เป็นเครื่องมือสร้างและฉันต้องการแบ่งปันสิ่งที่ได้ผลสำหรับฉันสำหรับสมมติฐานต่อไปนี้:
- Spring Boot Starter JPA (เว็บและความปลอดภัย - ทางเลือก)
- สร้าง Gradle ด้วย
- PostgreSQL ทำงานและตั้งค่าด้วยฐานข้อมูล (เช่น schema, user, db)
คุณต้องมีสิ่งต่อไปนี้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
อ้างอิง สิ่งนี้สามารถทำได้โดยการตั้งค่าspring.datasource.type=com.zaxxer.hikari.HikariDataSource
แต่ฉันไม่ต้องการการพึ่งพาเพิ่มเติมหากฉันไม่ต้องการ
- การยกเว้นครั้งที่สองสั่งให้ gradle ยกเว้น
hibernate-core
เมื่อดาวน์โหลดการcom.zaxxer
อ้างอิงและนั่นเป็นเพราะhibernate-core
ดาวน์โหลดแล้วSpring Boot
และเราไม่ต้องการลงเอยด้วยเวอร์ชันที่แตกต่างกัน
- การยกเว้นประการที่สามสั่งให้ gradle ยกเว้น
hibernate-core
เมื่อดาวน์โหลดhibernate-hikaricp
โมดูลที่จำเป็นเพื่อให้ HikariCP ใช้org.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
- หลังจากสอนฤดูใบไม้ผลิที่จะใช้การเชื่อมต่อให้บริการใหม่เมื่ออัตโนมัติกำหนดค่าจำศีล / 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:
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 วิกิพีเดียที่แสดงให้เห็นวิธีการติดตั้งสปริง Boot กับ JPA แต่ขาดคำอธิบายและรายละเอียด
ไฟล์สองไฟล์ข้างต้นยังมีให้ใช้งานในรูปแบบสาธารณะhttps://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6