Je suis tombé sur HikariCP
et j'ai été étonné par les repères et je voulais l'essayer au lieu de mon choix par défaut C3P0
et à ma grande surprise, j'ai eu du mal à faire le configurations
bon probablement parce que les configurations diffèrent en fonction de la combinaison de pile technologique que vous utilisez.
J'ai un Spring Boot
projet d' installation avec des JPA, Web, Security
démarreurs (à l'aide de Spring Initializer ) à utiliser PostgreSQL
comme base de données avec HikariCP
comme pool de connexion.
J'ai utilisé Gradle
comme 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.gradle
si vous utilisez Gradle
ou un équivalent pom.xml
si 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.gradle
et c'est parce que
- Exclure d'abord, indique gradle qui exclut le
jdbc-tomcat
pool de connexions lors du téléchargement des spring-boot-starter-data-jpa
dépendances. Cela peut être réalisé en configurant spring.datasource.type=com.zaxxer.hikari.HikariDataSource
aussi 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-core
lors du téléchargement de la com.zaxxer
dépendance, car elle hibernate-core
est déjà téléchargée par Spring Boot
et nous ne voulons pas nous retrouver avec des versions différentes.
- Troisième exclusion, indique à gradle d'exclure
hibernate-core
lors du téléchargement du hibernate-hikaricp
module nécessaire pour que HikariCP soit utilisé org.hibernate.hikaricp.internal.HikariCPConnectionProvider
comme fournisseur de connexion au lieu d'être obsolètecom.zaxxer.hikari.hibernate.HikariConnectionProvider
Une fois que j'ai compris build.gradle
ce qu'il fallait conserver et ce qu'il ne fallait pas, j'étais prêt à copier / coller une datasource
configuration dans mon application.properties
et 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/value
dans le application.properties
et se plaignait de dataSource, dataSourceClassName, jdbcUrl
. J'ai dû déboguer HikariConfig, HikariConfigurationUtil, HikariCPConnectionProvider
et découvrir que HikariCP
je ne pouvais pas trouver les propriétés application.properties
car 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 HikariCP
capable 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.properties
fichier 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.properties
avec 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 & Spring
détermine à partir spring.datasource.url
de laquelle pilote de base de données à utiliser).
Je n'ai pas vu la nécessité de créer un DataSource
bean et c'est parce que Spring Boot est capable de tout faire pour moi juste en regardant application.properties
et 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