Tôi đã xem qua HikariCPvà 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 C3P0và 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 Bootdự án thiết lập với trình JPA, Web, Securitykhởi động (Sử dụng Bộ khởi tạo mùa xuân ) để sử dụng PostgreSQLlàm cơ sở dữ liệu với HikariCPlàm tổng hợp kết nối.
Tôi đã sử dụng Gradlelà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.gradlenếu bạn đang sử dụng Gradlehoặc tương đương pom.xmlnế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.gradlevà đó là bởi vì
- Loại trừ đầu tiên, hướng dẫn gradle loại trừ nhóm
jdbc-tomcatkết nối khi tải xuống các phần spring-boot-starter-data-jpaphụ thuộc. Điều này có thể đạt được bằng cách thiết lập spring.datasource.type=com.zaxxer.hikari.HikariDataSourcecũ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-corekhi tải xuống com.zaxxerphụ thuộc và đó là vì hibernate-coređã được tải xuống bởi Spring Bootvà 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-corekhi tải xuống hibernate-hikaricpmô-đun cần thiết để sử dụng HikariCP org.hibernate.hikaricp.internal.HikariCPConnectionProviderlà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.gradlecái gì nên giữ và cái gì không, tôi đã sẵn sàng sao chép / dán một datasourcecấu hình vào cấu hình của tôi application.propertiesvà 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/valuetrong đó application.propertiesvà đang phàn nàn dataSource, dataSourceClassName, jdbcUrl. Tôi đã phải gỡ lỗi vào HikariConfig, HikariConfigurationUtil, HikariCPConnectionProvidervà phát hiện ra rằng HikariCPkhô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 HikariCPcó 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.propertiestệ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.propertiesvớ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 & Springtì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 DataSourcebean 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.propertiesvà đ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