Я наткнулся на 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')
// Exclude the tomcat-jdbc since it's used as default for connection pooling
// This can also be achieved by setting the spring.datasource.type to HikariCP
// datasource see application.properties below
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')
// Download HikariCP but, exclude hibernate-core to avoid version conflicts
compile('com.zaxxer:HikariCP:2.5.1') {
exclude group: 'org.hibernate', module: 'hibernate-core'
}
// Need this in order to get the HikariCPConnectionProvider
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
, но мне не нужна дополнительная зависимость, если она мне не нужна.
- Второе исключение указывает 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 и спящий режим (потому что я не назвал значения ключей свойств правильно)
- 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://localhost:5432/somedb
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 wiki показывает, как настроить Spring Boot с JPA, но без объяснения и деталей.
Вышеупомянутые два файла также доступны как общедоступный https://gist.github.com/rhamedy/b3cb936061cc13b86acdfe2 / а>
person
Raf
schedule
12.11.2017
spring.datasource.hikari.*
, документация: github.com/brettwooldridge/HikariCP - person kinjelom   schedule 10.08.2017