Natknąłem się HikariCP
i byłem zdumiony testami porównawczymi i chciałem go wypróbować zamiast mojego domyślnego wyboru C3P0
i ku mojemu zdziwieniu walczyłem, aby uzyskać configurations
właściwą, prawdopodobnie dlatego, że konfiguracje różnią się w zależności od kombinacji stosu technologicznego, którego używasz.
Mam Spring Boot
projekt instalacyjny ze JPA, Web, Security
starterami (przy użyciu Spring Initializer ) do wykorzystania PostgreSQL
jako baza danych HikariCP
jako pule połączeń.
Użyłem Gradle
jako 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.gradle
jeśli używasz Gradle
lub odpowiednika, pom.xml
jeś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.gradle
a to dlatego, że
- Najpierw wyklucz, instruuje gradle, że
jdbc-tomcat
podczas pobierania spring-boot-starter-data-jpa
zależności wyklucza pulę połączeń . Można to osiągnąć, konfigurując spring.datasource.type=com.zaxxer.hikari.HikariDataSource
również, ale nie chcę dodatkowej zależności, jeśli jej nie potrzebuję
- Drugie wykluczanie instruuje gradle, aby wykluczył zależność
hibernate-core
podczas pobierania, com.zaxxer
a to dlatego, że hibernate-core
zostało już pobrane przez Spring Boot
i nie chcemy mieć różnych wersji.
- Trzecie wykluczanie, instruuje gradle, aby wykluczył
hibernate-core
podczas pobierania hibernate-hikaricp
modułu, który jest potrzebny, aby HikariCP był używany org.hibernate.hikaricp.internal.HikariCPConnectionProvider
jako dostawca połączenia, zamiast być przestarzałymcom.zaxxer.hikari.hibernate.HikariConnectionProvider
Kiedy już zorientowałem się, build.gradle
co zachować, a czego nie, byłem gotowy do skopiowania / wklejenia datasource
konfiguracji do mojej application.properties
i 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/value
w application.properties
i narzekał dataSource, dataSourceClassName, jdbcUrl
. Musiałem przeprowadzić debugowanie HikariConfig, HikariConfigurationUtil, HikariCPConnectionProvider
i okazało się, że HikariCP
nie mogę znaleźć właściwości, application.properties
ponieważ 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 HikariCP
jest 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.properties
plik.
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.properties
z 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 & Spring
postać się od spring.datasource.url
, na którym sterownik bazy danych do użycia).
Nie widziałem potrzeby tworzenia DataSource
fasoli, a to dlatego, że Spring Boot jest w stanie zrobić dla mnie wszystko, po prostu zaglądając application.properties
i 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