Я зіткнувся 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