私は出くわしHikariCP
、ベンチマークに驚いて、デフォルトの選択の代わりにそれを試してみたかったのですC3P0
が、驚いたことにconfigurations
、使用している技術スタックの組み合わせによって構成が異なるため、正しく取得するのに苦労しました。
接続プールとしてデータベースとして使用Spring Boot
するJPA, Web, Security
スターター(Spring Initializerを使用)を使用PostgreSQL
してプロジェクトをセットアップしましたHikariCP
。
私はGradle
ビルドツールとして使用しましたが、次の仮定で何がうまくいったかを共有したいと思います。
- Spring Boot Starter JPA(Webおよびセキュリティ-オプション)
- Gradleビルドも
- データベース(つまり、スキーマ、ユーザー、データベース)を使用したPostgreSQLの実行とセットアップ
Mavenを使用している場合build.gradle
は以下が必要です。Mavenを使用している場合はGradle
同等のものがpom.xml
必要です。
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し、依存関係を
jdbc-tomcat
ダウンロードするときに接続プールを除外するgradleに指示しますspring-boot-starter-data-jpa
。これspring.datasource.type=com.zaxxer.hikari.HikariDataSource
も設定することで実現できますが、必要がなければ追加の依存関係は必要ありません
- 2番目の除外は、依存関係を
hibernate-core
ダウンロードするときに除外するようにgradleに指示します。com.zaxxer
これhibernate-core
は、がすでにダウンロードされてSpring Boot
おり、異なるバージョンになってしまうことを望まないためです。
- 3番目の除外、HikariCPを非推奨ではなく接続プロバイダーとして使用するために必要なモジュールを
hibernate-core
ダウンロードするときに除外hibernate-hikaricp
するようにgradleに指示しますorg.hibernate.hikaricp.internal.HikariCPConnectionProvider
com.zaxxer.hikari.hibernate.HikariConnectionProvider
build.gradle
何を保持し、何を保持しないかを理解したら、datasource
構成をコピーして貼り付ける準備ができ、application.properties
すべてがフライングカラーで機能することを期待していましたが、実際にはそうではなく、次の問題に遭遇しました。
- Spring Bootがデータベースの詳細(つまり、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
、プロパティ(つまり、データベースの詳細であるデータソースとプールプロパティ)を選択できることを確認し、SpingBootが期待どおりに動作することを確認しました。次の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はこれらを選択してプールを設定し、キャメルケースのフィールド名をメモします)
- spring.jpa.hibernate.connection.provider_class(新しいHibernateConnectionProviderを使用するようにSpringに指示します)
- spring.jpa.properties.hibernate.x(SpringがJPAを自動構成するために使用し、フィールド名をアンダースコアでメモします)
上記のプロパティファイルの使用方法とプロパティの名前の付け方を示すチュートリアルや投稿、またはリソースを見つけるのは困難です。さて、あなたはそれを持っています。
上記application.properties
をbuild.gradle
(または少なくとも同様の)Spring Boot JPAプロジェクトバージョン(1.5.8)に投入すると、魅力のように機能し、事前構成されたデータベースに接続する必要があります(つまり、私の場合、両方HikariCP & Spring
がそのspring.datasource.url
上から理解するのはPostgreSQLです。使用するデータベースドライバ)。
DataSource
Beanを作成する必要性はわかりませんでした。それは、Spring Bootが調べるだけですべてを実行できるためapplication.properties
、それはすばらしいことです。
記事HikariCPのgithubのの中のwikiどのようにJPAを使用してセットアップ春ブーツのショーだが、説明や詳細を欠いています。
上記の2つのファイルは、公開の要点としても利用できますhttps://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6