Natknąłem się HikariCPi byłem zdumiony testami porównawczymi i chciałem go wypróbować zamiast mojego domyślnego wyboru C3P0i ku mojemu zdziwieniu walczyłem, aby uzyskać configurationswłaściwą, prawdopodobnie dlatego, że konfiguracje różnią się w zależności od kombinacji stosu technologicznego, którego używasz.
Mam Spring Bootprojekt instalacyjny ze JPA, Web, Securitystarterami (przy użyciu Spring Initializer ) do wykorzystania PostgreSQLjako baza danych HikariCPjako pule połączeń.
Użyłem Gradlejako narzędzia do budowania i chciałbym podzielić się tym, co zadziałało dla mnie przy następujących założeniach:
- Spring Boot Starter JPA (Internet i zabezpieczenia - opcjonalnie)
- Kompilacja Gradle też
- Uruchomienie PostgreSQL i konfiguracja z bazą danych (tj. Schemat, użytkownik, baza danych)
Potrzebujesz następujących elementów, build.gradlejeśli używasz Gradlelub odpowiednika, pom.xmljeśli używasz 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'
}
}
W powyższym jest kilka wykluczeń, build.gradlea to dlatego, że
- Najpierw wyklucz, instruuje gradle, że
jdbc-tomcatpodczas pobierania spring-boot-starter-data-jpazależności wyklucza pulę połączeń . Można to osiągnąć, konfigurując spring.datasource.type=com.zaxxer.hikari.HikariDataSourcerównież, ale nie chcę dodatkowej zależności, jeśli jej nie potrzebuję
- Drugie wykluczanie instruuje gradle, aby wykluczył zależność
hibernate-corepodczas pobierania, com.zaxxera to dlatego, że hibernate-corezostało już pobrane przez Spring Booti nie chcemy mieć różnych wersji.
- Trzecie wykluczanie, instruuje gradle, aby wykluczył
hibernate-corepodczas pobierania hibernate-hikaricpmodułu, który jest potrzebny, aby HikariCP był używany org.hibernate.hikaricp.internal.HikariCPConnectionProviderjako dostawca połączenia, zamiast być przestarzałymcom.zaxxer.hikari.hibernate.HikariConnectionProvider
Kiedy już zorientowałem się, build.gradleco zachować, a czego nie, byłem gotowy do skopiowania / wklejenia datasourcekonfiguracji do mojej application.propertiesi spodziewałem się, że wszystko będzie działać śpiewająco, ale nie do końca i natknąłem się na następujące problemy
- Podczas rozruchu wiosennego nie udało się znaleźć szczegółów bazy danych (tj. Adresu URL, sterownika), w związku z czym nie można skonfigurować jpa i hibernacji (ponieważ nie nadałem właściwej nazwy wartości klucza właściwości)
- HikariCP cofa się do
com.zaxxer.hikari.hibernate.HikariConnectionProvider
- Po poinstruowaniu Springa, aby używał nowego dostawcy połączenia podczas automatycznej konfiguracji hibernacji / jpa, HikariCP zawiódł, ponieważ szukał niektórych
key/valuew application.propertiesi narzekał dataSource, dataSourceClassName, jdbcUrl. Musiałem przeprowadzić debugowanie HikariConfig, HikariConfigurationUtil, HikariCPConnectionProvideri okazało się, że HikariCPnie mogę znaleźć właściwości, application.propertiesponieważ zostały one nazwane inaczej.
W każdym razie w tym miejscu musiałem polegać na próbach i błędach i upewnić się, że HikariCPjest w stanie wybrać właściwości (tj. Źródło danych, które jest szczegółami bazy danych, a także właściwościami puli), a także Sping Boot zachowuje się zgodnie z oczekiwaniami i skończyło się na następujący application.propertiesplik.
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
Jak pokazano powyżej, konfiguracje są podzielone na kategorie w oparciu o następujące wzorce nazewnictwa
- spring.datasource.x (automatyczna konfiguracja Springa wybierze te, więc HikariCP)
- spring.datasource.hikari.x (HikariCP wybiera je do konfiguracji puli, zanotuj nazwy pól camelCase)
- spring.jpa.hibernate.connection.provider_class ( instruuje Spring, aby używał nowego HibernateConnectionProvider)
- spring.jpa.properties.hibernate.x (używany przez Spring do automatycznej konfiguracji JPA, zanotuj nazwy pól z podkreśleniami)
Trudno znaleźć samouczek, post lub jakiś zasób, który pokazuje, jak używany jest powyższy plik właściwości i jak należy nazywać właściwości. Cóż, masz to.
Rzucanie wyżej application.propertiesz build.gradle(lub przynajmniej podobny) do wersji projektu Wiosna Boot JPA (1.5.8) powinien działać jak czar i połączyć się z bazą danych wstępnie skonfigurowana (czyli w moim przypadku jest to, że zarówno PostgreSQL HikariCP & Springpostać się od spring.datasource.url, na którym sterownik bazy danych do użycia).
Nie widziałem potrzeby tworzenia DataSourcefasoli, a to dlatego, że Spring Boot jest w stanie zrobić dla mnie wszystko, po prostu zaglądając application.propertiesi to jest fajne.
Artykuł w GitHub HikariCP za wiki pokazuje sposób konfiguracji wiosennego rozruchu z JPA, ale brakuje wyjaśnień i szczegółów.
Powyższe dwa pliki są również dostępne jako publiczna treść https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6