Saya menemukan HikariCPdan saya kagum dengan tolok ukur dan saya ingin mencobanya daripada pilihan default saya C3P0dan yang mengejutkan saya, saya berjuang untuk mendapatkan yang configurationsbenar mungkin karena konfigurasinya berbeda berdasarkan kombinasi tumpukan teknologi yang Anda gunakan.
Saya memiliki Spring Bootproyek pengaturan dengan JPA, Web, Securitypermulaan (Menggunakan Spring Initializer ) untuk digunakan PostgreSQLsebagai database dengan HikariCPpenggabungan koneksi.
Saya telah menggunakan Gradlesebagai 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.gradlejika Anda menggunakan Gradleatau yang setara pom.xmljika 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.gradledan itu karena
- Pertama kecualikan, perintahkan gradle yang mengecualikan
jdbc-tomcatkumpulan koneksi saat mengunduh spring-boot-starter-data-jpadependensi. Ini dapat dicapai dengan menyiapkan spring.datasource.type=com.zaxxer.hikari.HikariDataSourcejuga tetapi, saya tidak ingin ketergantungan tambahan jika saya tidak membutuhkannya
- Kedua mengecualikan, memerintahkan gradle untuk mengecualikan
hibernate-coresaat mengunduh com.zaxxerketergantungan dan itu karena hibernate-coresudah diunduh oleh Spring Bootdan kami tidak ingin berakhir dengan versi yang berbeda.
- Kecualikan ketiga, perintahkan gradle untuk mengecualikan
hibernate-coresaat mengunduh hibernate-hikaricpmodul yang diperlukan untuk membuat HikariCP digunakan org.hibernate.hikaricp.internal.HikariCPConnectionProvidersebagai penyedia koneksi alih-alih tidak digunakan lagicom.zaxxer.hikari.hibernate.HikariConnectionProvider
Setelah saya menemukan build.gradledan apa yang harus disimpan dan apa yang tidak, saya siap untuk menyalin / menempelkan datasourcekonfigurasi ke dalam saya application.propertiesdan 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/valuedi application.propertiesdan yang dikeluhkan dataSource, dataSourceClassName, jdbcUrl. Saya harus men-debug HikariConfig, HikariConfigurationUtil, HikariCPConnectionProviderdan menemukan bahwa HikariCPtidak dapat menemukan properti dari application.propertieskarena namanya berbeda.
Bagaimanapun, di sinilah saya harus mengandalkan trial and error dan memastikan bahwa HikariCPdapat memilih properti (yaitu sumber data yang detail db, serta properti penyatuan) serta Sping Boot berperilaku seperti yang diharapkan dan saya berakhir dengan application.propertiesfile 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.propertiesdengan 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 & Springmencari tahu darispring.datasource.url mana driver database untuk digunakan).
Saya tidak melihat kebutuhan untuk membuat DataSourcekacang dan itu karena Spring Boot mampu melakukan segalanya untuk saya hanya dengan melihat ke dalam application.propertiesdan 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