Ich HikariCP
bin auf die Benchmarks gestoßen und war erstaunt. Ich wollte sie anstelle meiner Standardauswahl ausprobieren. C3P0
Zu meiner Überraschung hatte ich Probleme, das configurations
Richtige zu finden, wahrscheinlich weil sich die Konfigurationen je nach verwendeter Kombination von Tech-Stacks unterscheiden.
Ich habe ein Setup- Spring Boot
Projekt mit JPA, Web, Security
Startern (Using Spring Initializer ) zur Verwendung PostgreSQL
als Datenbank mit HikariCP
als Verbindungspooling.
Ich habe Gradle
als Build-Tool verwendet und möchte mitteilen, was für mich unter den folgenden Annahmen funktioniert hat:
- Spring Boot Starter JPA (Web & Sicherheit - optional)
- Gradle bauen auch
- PostgreSQL wird ausgeführt und mit einer Datenbank eingerichtet (z. B. Schema, Benutzer, Datenbank).
Sie benötigen Folgendes, build.gradle
wenn Sie Maven verwenden, Gradle
oder ein gleichwertiges pom.xml
Element, wenn Sie Maven verwenden
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'
}
}
Es gibt eine Reihe von Ausschlüssen oben build.gradle
und das liegt daran
- Zuerst ausschließen, weist gradle an, den
jdbc-tomcat
Verbindungspool beim Herunterladen der spring-boot-starter-data-jpa
Abhängigkeiten auszuschließen . Dies kann erreicht werden, indem Sie spring.datasource.type=com.zaxxer.hikari.HikariDataSource
auch einrichten. Ich möchte jedoch keine zusätzliche Abhängigkeit, wenn ich sie nicht benötige
- Zweitens ausschließen, weist gradle an,
hibernate-core
beim Herunterladen von com.zaxxer
Abhängigkeiten auszuschließen, und das liegt daran, dass hibernate-core
es bereits von heruntergeladen wurde Spring Boot
und wir nicht mit unterschiedlichen Versionen enden möchten.
- Drittens weist gradle an, gradle
hibernate-core
beim Herunterladen des hibernate-hikaricp
Moduls auszuschließen, das erforderlich ist, damit HikariCP org.hibernate.hikaricp.internal.HikariCPConnectionProvider
als Verbindungsanbieter verwendet wird, anstatt veraltet zu seincom.zaxxer.hikari.hibernate.HikariConnectionProvider
Nachdem ich herausgefunden hatte, build.gradle
was und was ich behalten sollte und was nicht, war ich bereit, eine datasource
Konfiguration in meine zu kopieren / einzufügen application.properties
und erwartete, dass alles mit Bravour funktioniert, aber nicht wirklich, und ich stieß auf die folgenden Probleme
- Spring Boot konnte die Datenbankdetails (z. B. URL, Treiber) nicht herausfinden und konnte daher jpa und den Ruhezustand nicht einrichten (da ich die Eigenschaftsschlüsselwerte nicht richtig benannt habe).
- HikariCP fällt zurück auf
com.zaxxer.hikari.hibernate.HikariConnectionProvider
- Nachdem Spring angewiesen wurde, einen neuen Verbindungsanbieter für die automatische Konfiguration von hibernate / jpa zu verwenden, schlug HikariCP fehl, weil es nach einigen
key/value
im Internet suchte application.properties
und sich darüber beschwerte dataSource, dataSourceClassName, jdbcUrl
. Ich musste debuggen HikariConfig, HikariConfigurationUtil, HikariCPConnectionProvider
und fand heraus, dass ich HikariCP
die Eigenschaften nicht finden konnte, application.properties
weil sie anders benannt waren.
Auf HikariCP
jeden Fall musste ich mich hier auf Versuch und Irrtum verlassen und sicherstellen, dass die Eigenschaften (dh die Datenquelle, die Datenbankdetails enthält, sowie die Pooling-Eigenschaften) sowie das Sping-Boot-Verhalten sich wie erwartet verhalten die folgende application.properties
Datei.
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
Wie oben gezeigt, werden die Konfigurationen basierend auf den folgenden Namensmustern in Kategorien unterteilt
- spring.datasource.x (Spring Auto-Configure wählt diese aus, ebenso HikariCP)
- spring.datasource.hikari.x (HikariCP wählt diese aus, um den Pool einzurichten, notiert sich die Namen der camelCase-Felder)
- spring.jpa.hibernate.connection.provider_class ( Weist Spring an, den neuen HibernateConnectionProvider zu verwenden)
- spring.jpa.properties.hibernate.x (Wird von Spring verwendet, um JPA automatisch zu konfigurieren. Notieren Sie sich die Feldnamen mit Unterstrichen.)
Es ist schwierig, auf ein Tutorial, einen Beitrag oder eine Ressource zu stoßen, die zeigt, wie die obige Eigenschaftendatei verwendet wird und wie die Eigenschaften benannt werden sollten. Nun, da hast du es.
Das oben Genannte application.properties
mit build.gradle
(oder zumindest ähnlich) in eine Spring Boot JPA-Projektversion (1.5.8) zu werfen, sollte wie ein Zauber funktionieren und eine Verbindung zu Ihrer vorkonfigurierten Datenbank herstellen (dh in meinem Fall ist es PostgreSQL, die beide HikariCP & Spring
herausfinden, spring.datasource.url
auf welcher zu verwendender Datenbanktreiber).
Ich habe nicht die Notwendigkeit gesehen, eine DataSource
Bohne zu kreieren , und das liegt daran, dass Spring Boot in der Lage ist, alles für mich zu tun, indem ich nur nachschaue, application.properties
und das ist ordentlich.
Der Artikel im Github- Wiki von HikariCP zeigt, wie Spring Boot mit JPA eingerichtet wird, es fehlen jedoch Erklärungen und Details.
Die beiden oben genannten Dateien sind auch als öffentlicher Inhalt verfügbar: https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6