Je suis tombé sur HikariCPet j'ai été étonné par les repères et je voulais l'essayer au lieu de mon choix par défaut C3P0et à ma grande surprise, j'ai eu du mal à faire le configurationsbon probablement parce que les configurations diffèrent en fonction de la combinaison de pile technologique que vous utilisez.
J'ai un Spring Bootprojet d' installation avec des JPA, Web, Securitydémarreurs (à l'aide de Spring Initializer ) à utiliser PostgreSQLcomme base de données avec HikariCPcomme pool de connexion.
J'ai utilisé Gradlecomme outil de construction et j'aimerais partager ce qui a fonctionné pour moi pour les hypothèses suivantes:
- Spring Boot Starter JPA (Web et sécurité - en option)
- Gradle construit aussi
- PostgreSQL en cours d'exécution et configuration avec une base de données (ie schéma, utilisateur, base de données)
Vous avez besoin des éléments suivants build.gradlesi vous utilisez Gradleou un équivalent pom.xmlsi vous utilisez 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'
}
}
Il y a un tas d'exclusions dans ce qui précède build.gradleet c'est parce que
- Exclure d'abord, indique gradle qui exclut le
jdbc-tomcatpool de connexions lors du téléchargement des spring-boot-starter-data-jpadépendances. Cela peut être réalisé en configurant spring.datasource.type=com.zaxxer.hikari.HikariDataSourceaussi mais, je ne veux pas de dépendance supplémentaire si je n'en ai pas besoin
- La deuxième exclusion, indique à Gradle d'exclure
hibernate-corelors du téléchargement de la com.zaxxerdépendance, car elle hibernate-coreest déjà téléchargée par Spring Bootet nous ne voulons pas nous retrouver avec des versions différentes.
- Troisième exclusion, indique à gradle d'exclure
hibernate-corelors du téléchargement du hibernate-hikaricpmodule nécessaire pour que HikariCP soit utilisé org.hibernate.hikaricp.internal.HikariCPConnectionProvidercomme fournisseur de connexion au lieu d'être obsolètecom.zaxxer.hikari.hibernate.HikariConnectionProvider
Une fois que j'ai compris build.gradlece qu'il fallait conserver et ce qu'il ne fallait pas, j'étais prêt à copier / coller une datasourceconfiguration dans mon application.propertieset je m'attendais à ce que tout fonctionne avec brio, mais pas vraiment et je suis tombé sur les problèmes suivants
- Spring boot ne parvient pas à trouver les détails de la base de données (c'est-à-dire l'URL, le pilote), par conséquent, impossible de configurer jpa et hibernate (car je n'ai pas nommé les valeurs de clé de propriété correctement)
- HikariCP revient à
com.zaxxer.hikari.hibernate.HikariConnectionProvider
- Après avoir demandé à Spring d'utiliser un nouveau fournisseur de connexion pour la configuration automatique de hibernate / jpa, HikariCP a échoué car il en recherchait
key/valuedans le application.propertieset se plaignait de dataSource, dataSourceClassName, jdbcUrl. J'ai dû déboguer HikariConfig, HikariConfigurationUtil, HikariCPConnectionProvideret découvrir que HikariCPje ne pouvais pas trouver les propriétés application.propertiescar il était nommé différemment.
Quoi qu'il en soit, c'est là que je devais compter sur des essais et des erreurs et m'assurer que c'était HikariCPcapable de choisir les propriétés (c'est-à-dire la source de données qui contient les détails de la base de données, ainsi que les propriétés de mise en commun) ainsi que Sping Boot se comportent comme prévu et j'ai fini avec le application.propertiesfichier suivant .
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
Comme indiqué ci-dessus, les configurations sont divisées en catégories en fonction des modèles de dénomination suivants
- spring.datasource.x (la configuration automatique de Spring les choisira, tout comme HikariCP)
- spring.datasource.hikari.x (HikariCP les choisit pour configurer le pool, notez les noms des champs camelCase)
- spring.jpa.hibernate.connection.provider_class ( demande à Spring d'utiliser le nouveau HibernateConnectionProvider)
- spring.jpa.properties.hibernate.x (Utilisé par Spring pour configurer automatiquement JPA, notez les noms de champ avec des traits de soulignement)
Il est difficile de trouver un didacticiel, une publication ou une ressource qui montre comment le fichier de propriétés ci-dessus est utilisé et comment les propriétés doivent être nommées. Bien, tu l'as maintenant.
Lancer ce qui précède application.propertiesavec build.gradle(ou au moins similaire) dans une version de projet Spring Boot JPA (1.5.8) devrait fonctionner comme un charme et se connecter à votre base de données préconfigurée (c'est-à-dire dans mon cas, c'est PostgreSQL qui HikariCP & Springdétermine à partir spring.datasource.urlde laquelle pilote de base de données à utiliser).
Je n'ai pas vu la nécessité de créer un DataSourcebean et c'est parce que Spring Boot est capable de tout faire pour moi juste en regardant application.propertieset c'est bien.
L' article du wiki github de HikariCP montre comment configurer Spring Boot avec JPA mais manque d'explications et de détails.
Les deux fichiers ci-dessus sont également disponibles en tant que contenu public https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6