Tôi đã xem qua HikariCP
và tôi đã rất ngạc nhiên bởi các điểm chuẩn và tôi muốn thử nó thay vì lựa chọn mặc định của mình C3P0
và thật ngạc nhiên, tôi đã đấu tranh để chọn configurations
đúng có lẽ vì các cấu hình khác nhau dựa trên sự kết hợp của ngăn xếp công nghệ bạn đang sử dụng.
Tôi có Spring Boot
dự án thiết lập với trình JPA, Web, Security
khởi động (Sử dụng Bộ khởi tạo mùa xuân ) để sử dụng PostgreSQL
làm cơ sở dữ liệu với HikariCP
làm tổng hợp kết nối.
Tôi đã sử dụng Gradle
làm công cụ xây dựng và tôi muốn chia sẻ những gì phù hợp với tôi cho các giả định sau:
- Spring Boot Starter JPA (Web & Security - tùy chọn)
- Gradle cũng xây dựng
- PostgreSQL đang chạy và thiết lập với cơ sở dữ liệu (tức là lược đồ, người dùng, db)
Bạn cần những thứ sau build.gradle
nếu bạn đang sử dụng Gradle
hoặc tương đương pom.xml
nếu bạn đang sử dụng 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'
}
}
Có rất nhiều loại trừ ở trên build.gradle
và đó là bởi vì
- Loại trừ đầu tiên, hướng dẫn gradle loại trừ nhóm
jdbc-tomcat
kết nối khi tải xuống các phần spring-boot-starter-data-jpa
phụ thuộc. Điều này có thể đạt được bằng cách thiết lập spring.datasource.type=com.zaxxer.hikari.HikariDataSource
cũng nhưng, tôi không muốn có thêm phụ thuộc nếu tôi không cần nó
- Loại trừ thứ hai, hướng dẫn gradle loại trừ
hibernate-core
khi tải xuống com.zaxxer
phụ thuộc và đó là vì hibernate-core
đã được tải xuống bởi Spring Boot
và chúng tôi không muốn kết thúc với các phiên bản khác nhau.
- Loại trừ thứ ba, hướng dẫn gradle loại trừ
hibernate-core
khi tải xuống hibernate-hikaricp
mô-đun cần thiết để sử dụng HikariCP org.hibernate.hikaricp.internal.HikariCPConnectionProvider
làm nhà cung cấp kết nối thay vì không dùng nữacom.zaxxer.hikari.hibernate.HikariConnectionProvider
Khi tôi đã tìm ra build.gradle
cái gì nên giữ và cái gì không, tôi đã sẵn sàng sao chép / dán một datasource
cấu hình vào cấu hình của tôi application.properties
và mong đợi mọi thứ hoạt động với màu sắc bị bay màu, nhưng không thực sự và tôi đã vấp phải những vấn đề sau
- Khởi động mùa xuân không tìm ra chi tiết cơ sở dữ liệu (tức là url, trình điều khiển), do đó, không thể thiết lập jpa và ngủ đông (vì tôi không đặt tên cho các giá trị khóa thuộc tính đúng)
- HikariCP giảm trở lại
com.zaxxer.hikari.hibernate.HikariConnectionProvider
- Sau khi hướng dẫn Spring sử dụng trình cung cấp kết nối mới khi tự động định cấu hình hibernate / jpa thì HikariCP không thành công vì nó đang tìm kiếm một số
key/value
trong đó application.properties
và đang phàn nàn dataSource, dataSourceClassName, jdbcUrl
. Tôi đã phải gỡ lỗi vào HikariConfig, HikariConfigurationUtil, HikariCPConnectionProvider
và phát hiện ra rằng HikariCP
không thể tìm thấy các thuộc tính từ application.properties
đó vì nó được đặt tên khác.
Dù sao, đây là nơi tôi phải dựa vào thử và sai và đảm bảo rằng HikariCP
có thể chọn các thuộc tính (tức là nguồn dữ liệu có chi tiết db, cũng như các thuộc tính tổng hợp) cũng như Sping Boot hoạt động như mong đợi và tôi đã kết thúc với application.properties
tệp sau đây .
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
Như được hiển thị ở trên, các cấu hình được chia thành các loại dựa trên các mẫu đặt tên sau
- spring.datasource.x (Tự động cấu hình mùa xuân sẽ chọn những thứ này, HikariCP cũng vậy)
- spring.datasource.hikari.x (HikariCP chọn những thứ này để thiết lập nhóm, ghi chú tên trường camelCase)
- spring.jpa.hibernate.connection.provider_class (Hướng dẫn Spring sử dụng HibernateConnectionProvider mới)
- spring.jpa.properties.hibernate.x (Được Spring sử dụng để tự động định cấu hình JPA, ghi chú các tên trường có dấu gạch dưới)
Thật khó để bắt gặp một hướng dẫn hoặc bài đăng hoặc một số tài nguyên cho thấy cách sử dụng tệp thuộc tính ở trên và cách đặt tên các thuộc tính. Được, bạn đã có nó.
Việc ném những thứ trên application.properties
với build.gradle
(hoặc ít nhất là tương tự) vào phiên bản dự án Spring Boot JPA (1.5.8) sẽ hoạt động giống như một sự quyến rũ và kết nối với cơ sở dữ liệu được định cấu hình trước của bạn (nghĩa là trong trường hợp của tôi, đó là PostgreSQL mà cả hai đều HikariCP & Spring
tìm ra từ spring.datasource.url
đó trình điều khiển cơ sở dữ liệu để sử dụng).
Tôi không thấy cần thiết phải tạo DataSource
bean và đó là bởi vì Spring Boot có khả năng làm mọi thứ cho tôi chỉ bằng cách xem xét application.properties
và điều đó thật gọn gàng.
Các bài viết trong github HikariCP của wiki chương trình làm thế nào để thiết lập mùa xuân Boot với JPA nhưng, thiếu giải thích và chi tiết.
Hai tệp trên cũng có sẵn dưới dạng ý chính công khai https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6