Я наткнулся 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
, потому что
- Сначала exclude, инструктирует gradle, который исключает
jdbc-tomcat
пул соединений при загрузке spring-boot-starter-data-jpa
зависимостей. Этого можно достичь, установив spring.datasource.type=com.zaxxer.hikari.HikariDataSource
также, но, мне не нужна дополнительная зависимость, если она мне не нужна.
- Во-вторых, exclude, инструктирует 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
и ожидал, что все будет работать отлично, но не совсем, и я наткнулся на следующие проблемы
- При загрузке Spring не удалось узнать детали базы данных (например, 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 (автоматическая настройка Spring выберет их, как и 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 Boot JPA (1.5.8) должно работать как шарм и подключаться к вашей предварительно настроенной базе данных (т.е. в моем случае это PostgreSQL, который оба HikariCP & Spring
выясняют из того, spring.datasource.url
на каком драйвер базы данных для использования).
Я не видел необходимости создавать DataSource
bean-компонент, потому что Spring Boot может делать все за меня, просто заглянув в него, application.properties
и это здорово.
В статье на вики-сайте Github HikariCP показано, как настроить Spring Boot с JPA, но отсутствуют объяснения и подробности.
Эти два файла также доступны как общедоступный https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6