Saya menemukan HikariCP
dan saya kagum dengan tolok ukur dan saya ingin mencobanya daripada pilihan default saya C3P0
dan yang mengejutkan saya, saya berjuang untuk mendapatkan yang configurations
benar mungkin karena konfigurasinya berbeda berdasarkan kombinasi tumpukan teknologi yang Anda gunakan.
Saya memiliki Spring Boot
proyek pengaturan dengan JPA, Web, Security
permulaan (Menggunakan Spring Initializer ) untuk digunakan PostgreSQL
sebagai database dengan HikariCP
penggabungan koneksi.
Saya telah menggunakan Gradle
sebagai alat pembuatan dan saya ingin membagikan apa yang berhasil untuk saya untuk asumsi berikut:
- Spring Boot Starter JPA (Web & Keamanan - opsional)
- Gradle membangun juga
- PostgreSQL berjalan dan diatur dengan database (yaitu skema, pengguna, db)
Anda memerlukan yang berikut ini build.gradle
jika Anda menggunakan Gradle
atau yang setara pom.xml
jika Anda menggunakan 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'
}
}
Ada banyak pengecualian di atas build.gradle
dan itu karena
- Pertama kecualikan, perintahkan gradle yang mengecualikan
jdbc-tomcat
kumpulan koneksi saat mengunduh spring-boot-starter-data-jpa
dependensi. Ini dapat dicapai dengan menyiapkan spring.datasource.type=com.zaxxer.hikari.HikariDataSource
juga tetapi, saya tidak ingin ketergantungan tambahan jika saya tidak membutuhkannya
- Kedua mengecualikan, memerintahkan gradle untuk mengecualikan
hibernate-core
saat mengunduh com.zaxxer
ketergantungan dan itu karena hibernate-core
sudah diunduh oleh Spring Boot
dan kami tidak ingin berakhir dengan versi yang berbeda.
- Kecualikan ketiga, perintahkan gradle untuk mengecualikan
hibernate-core
saat mengunduh hibernate-hikaricp
modul yang diperlukan untuk membuat HikariCP digunakan org.hibernate.hikaricp.internal.HikariCPConnectionProvider
sebagai penyedia koneksi alih-alih tidak digunakan lagicom.zaxxer.hikari.hibernate.HikariConnectionProvider
Setelah saya menemukan build.gradle
dan apa yang harus disimpan dan apa yang tidak, saya siap untuk menyalin / menempelkan datasource
konfigurasi ke dalam saya application.properties
dan mengharapkan semuanya bekerja dengan warna terbang tetapi, tidak benar-benar dan saya tersandung pada masalah berikut
- Spring boot gagal menemukan detail database (yaitu url, driver) sehingga, tidak dapat mengatur jpa dan hibernate (karena saya tidak memberi nama nilai kunci properti dengan benar)
- HikariCP kembali ke
com.zaxxer.hikari.hibernate.HikariConnectionProvider
- Setelah menginstruksikan Spring untuk menggunakan penyedia koneksi baru ketika konfigurasi otomatis hibernate / jpa kemudian HikariCP gagal karena mencari beberapa
key/value
di application.properties
dan yang dikeluhkan dataSource, dataSourceClassName, jdbcUrl
. Saya harus men-debug HikariConfig, HikariConfigurationUtil, HikariCPConnectionProvider
dan menemukan bahwa HikariCP
tidak dapat menemukan properti dari application.properties
karena namanya berbeda.
Bagaimanapun, di sinilah saya harus mengandalkan trial and error dan memastikan bahwa HikariCP
dapat memilih properti (yaitu sumber data yang detail db, serta properti penyatuan) serta Sping Boot berperilaku seperti yang diharapkan dan saya berakhir dengan application.properties
file berikut .
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
Seperti yang ditunjukkan di atas, konfigurasi dibagi ke dalam kategori berdasarkan pola penamaan berikut
- spring.datasource.x (Konfigurasi otomatis musim semi akan memilih ini, begitu juga HikariCP)
- spring.datasource.hikari.x (HikariCP memilih ini untuk menyiapkan kolam, catat nama bidang CamelCase)
- spring.jpa.hibernate.connection.provider_class (Perintahkan Spring untuk menggunakan HibernateConnectionProvider baru)
- spring.jpa.properties.hibernate.x (Digunakan oleh Spring untuk mengkonfigurasi JPA secara otomatis, catat nama bidang dengan garis bawah)
Sulit untuk menemukan tutorial atau posting atau beberapa sumber daya yang menunjukkan bagaimana file properti di atas digunakan dan bagaimana properti harus diberi nama. Nah, begitulah.
Melempar hal di atas application.properties
dengan build.gradle
(atau setidaknya serupa) ke versi proyek JPA Spring Boot (1.5.8) akan bekerja seperti pesona dan terhubung ke database Anda yang telah dikonfigurasi sebelumnya (yaitu dalam kasus saya, PostgreSQL yang keduanya HikariCP & Spring
mencari tahu darispring.datasource.url
mana driver database untuk digunakan).
Saya tidak melihat kebutuhan untuk membuat DataSource
kacang dan itu karena Spring Boot mampu melakukan segalanya untuk saya hanya dengan melihat ke dalam application.properties
dan itu rapi.
The Artikel di HikariCP ini github wiki menunjukkan bagaimana untuk setup musim semi Boot dengan JPA tetapi, tidak memiliki penjelasan dan rincian.
Kedua file di atas juga tersedia sebagai inti publik https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6