Я зіткнувся HikariCPі був вражений тестами, і я хотів спробувати його замість мого вибору за замовчуванням, C3P0і, на мій подив, я намагався отримати configurationsправильний, ймовірно, тому що конфігурації відрізняються залежно від того, яку комбінацію технологічного стеку ви використовуєте.
У мене є Spring Bootпроект налаштування з JPA, Web, Securityпочатківцями (за допомогою Spring Initializer ), який використовуватимуть PostgreSQLяк базу даних та HikariCPяк пул з'єднань.
Я використовував Gradleяк інструмент побудови, і хотів би поділитися тим, що мені вдалося, для таких припущень:
- Spring Boot Starter JPA (Інтернет і безпека - необов’язково)
- Gradle теж будують
- Запуск і налаштування PostgreSQL з базою даних (тобто схема, користувач, db)
Вам потрібно наступне, build.gradleякщо ви використовуєте Gradleабо еквівалент, pom.xmlякщо ви використовуєте 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'
}
}
У вищезазначеному є купа виключень, build.gradleі це тому, що
- Спочатку виключає, вказує gradle, що виключає
jdbc-tomcatпул підключень під час завантаження spring-boot-starter-data-jpaзалежностей. Цього можна досягти, налаштувавши spring.datasource.type=com.zaxxer.hikari.HikariDataSourceтакож, але, я не хочу зайвої залежності, якщо мені це не потрібно
- Другий виняток, вказує gradle виключити
hibernate-coreпід час завантаження com.zaxxerзалежності, і це тому hibernate-core, що вже завантажено, Spring Bootі ми не хочемо отримувати різні версії.
- Третє виключення, вказує gradle виключити
hibernate-coreпри завантаженні hibernate-hikaricpмодуля, який необхідний для того, щоб використовувати HikariCP org.hibernate.hikaricp.internal.HikariCPConnectionProviderяк постачальника з'єднань замість застарілогоcom.zaxxer.hikari.hibernate.HikariConnectionProvider
Після того, як я зрозумів, build.gradleі що слід зберігати, а що ні, я був готовий скопіювати / вставити datasourceконфігурацію в свою application.propertiesі очікував, що все буде працювати з яскравими кольорами, але, насправді, я наткнувся на наступні проблеми
- Весняне завантаження не вдалося дізнатись деталі бази даних (тобто URL-адреса, драйвер), отже, не вдалося встановити jpa та hibernate (оскільки я не правильно вказав значення ключа властивості)
- HikariCP повертається до
com.zaxxer.hikari.hibernate.HikariConnectionProvider
- Після вказівки Spring використовувати нового постачальника з'єднань для автоматичного налаштування hibernate / jpa, тоді HikariCP не вдався, оскільки він шукав когось
key/valueу application.propertiesі скаржився dataSource, dataSourceClassName, jdbcUrl. Мені довелося налагодити HikariConfig, HikariConfigurationUtil, HikariCPConnectionProviderі вияснити, що HikariCPне вдалося знайти властивості, application.propertiesоскільки воно було названо інакше.
У будь-якому випадку, тут мені довелося покластися на спроби та помилки та переконатися, що HikariCPвін здатний вибирати властивості (тобто джерело даних, що містить детальну інформацію, а також об’єднувати властивості), а також Sping Boot поводитись належним чином, і я закінчив наступний application.propertiesфайл.
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
Як показано вище, конфігурації поділяються на категорії на основі наступних моделей імен
- spring.datasource.x (Весняна автоматична конфігурація вибере їх, як і HikariCP)
- spring.datasource.hikari.x (HikariCP вибирає їх для налаштування пулу, робить запис у назвах полів camelCase)
- spring.jpa.hibernate.connection.provider_class (Наказує Spring використовувати новий HibernateConnectionProvider)
- spring.jpa.properties.hibernate.x (Використовується Spring для автоматичного налаштування JPA, занотуйте імена полів підкресленням)
Важко натрапити на підручник чи допис чи якийсь ресурс, який показує, як використовується вищевказаний файл властивостей та як слід називати властивості. Ну, ось вам.
Кинувши вище application.propertiesз build.gradle(або принаймні схоже) в версію проекту Spring завантаження JPA (1.5.8) має працювати як шарм і підключення до попередньо сконфигурированной базі даних (тобто в моєму випадку це PostgreSQL , що і HikariCP & Springз'ясувати , від , spring.datasource.urlна якому використовувати драйвер бази даних).
Я не бачив необхідності створювати DataSourceбоб, і це тому, що Spring Boot здатний зробити все для мене, просто задивившись, application.propertiesі це акуратно.
Стаття в GitHub HikariCP в вікі показує , як налаштувати Spring Черевик з JPA , але, не вистачає пояснень і деталей.
Наведені вище два файли також доступні як загальнодоступна історія https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6