Ich HikariCPbin auf die Benchmarks gestoßen und war erstaunt. Ich wollte sie anstelle meiner Standardauswahl ausprobieren. C3P0Zu meiner Überraschung hatte ich Probleme, das configurationsRichtige zu finden, wahrscheinlich weil sich die Konfigurationen je nach verwendeter Kombination von Tech-Stacks unterscheiden.
Ich habe ein Setup- Spring BootProjekt mit JPA, Web, SecurityStartern (Using Spring Initializer ) zur Verwendung PostgreSQLals Datenbank mit HikariCPals Verbindungspooling.
Ich habe Gradleals 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.gradlewenn Sie Maven verwenden, Gradleoder ein gleichwertiges pom.xmlElement, 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.gradleund das liegt daran
- Zuerst ausschließen, weist gradle an, den
jdbc-tomcatVerbindungspool beim Herunterladen der spring-boot-starter-data-jpaAbhängigkeiten auszuschließen . Dies kann erreicht werden, indem Sie spring.datasource.type=com.zaxxer.hikari.HikariDataSourceauch einrichten. Ich möchte jedoch keine zusätzliche Abhängigkeit, wenn ich sie nicht benötige
- Zweitens ausschließen, weist gradle an,
hibernate-corebeim Herunterladen von com.zaxxerAbhängigkeiten auszuschließen, und das liegt daran, dass hibernate-corees bereits von heruntergeladen wurde Spring Bootund wir nicht mit unterschiedlichen Versionen enden möchten.
- Drittens weist gradle an, gradle
hibernate-corebeim Herunterladen des hibernate-hikaricpModuls auszuschließen, das erforderlich ist, damit HikariCP org.hibernate.hikaricp.internal.HikariCPConnectionProviderals Verbindungsanbieter verwendet wird, anstatt veraltet zu seincom.zaxxer.hikari.hibernate.HikariConnectionProvider
Nachdem ich herausgefunden hatte, build.gradlewas und was ich behalten sollte und was nicht, war ich bereit, eine datasourceKonfiguration in meine zu kopieren / einzufügen application.propertiesund 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/valueim Internet suchte application.propertiesund sich darüber beschwerte dataSource, dataSourceClassName, jdbcUrl. Ich musste debuggen HikariConfig, HikariConfigurationUtil, HikariCPConnectionProviderund fand heraus, dass ich HikariCPdie Eigenschaften nicht finden konnte, application.propertiesweil sie anders benannt waren.
Auf HikariCPjeden 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.propertiesDatei.
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.propertiesmit 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 & Springherausfinden, spring.datasource.urlauf welcher zu verwendender Datenbanktreiber).
Ich habe nicht die Notwendigkeit gesehen, eine DataSourceBohne zu kreieren , und das liegt daran, dass Spring Boot in der Lage ist, alles für mich zu tun, indem ich nur nachschaue, application.propertiesund 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