Solución:
@Configuration
@ConfigurationProperties(prefix = "params.datasource")
public class JpaConfig extends HikariConfig {
@Bean
public DataSource dataSource() throws SQLException {
return new HikariDataSource(this);
}
}
application.yml
params:
datasource:
driverClassName: com.mysql.jdbc.Driver
jdbcUrl: jdbc:mysql://localhost:3306/myDb
username: login
password: password
maximumPoolSize: 5
¡ACTUALIZADO! Desde la versión Spring Boot 1.3.0 :
- Simplemente agregue HikariCP a las dependencias
- Configurar application.yml
application.yml
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:h2:mem:TEST
driver-class-name: org.h2.Driver
username: username
password: password
hikari:
idle-timeout: 10000
¡ACTUALIZADO! Desde la versión Spring Boot 2.0.0 :
El grupo de conexiones predeterminado ha cambiado de Tomcat a Hikari 🙂
Me encontré con HikariCP
y me sorprendieron los puntos de referencia y quería probarlo en lugar de mi elección predeterminada C3P0
y para mi sorpresa luché por conseguir el configurations
probablemente porque las configuraciones difieren según la combinación de pila tecnológica que esté utilizando.
He configurado Spring Boot
proyecto con JPA, Web, Security
arrancadores (usando Spring Initializer) para usar PostgreSQL
como una base de datos con HikariCP
como agrupación de conexiones.
He usado Gradle
como herramienta de construcción y me gustaría compartir lo que funcionó para mí para las siguientes suposiciones:
- Spring Boot Starter JPA (Web y seguridad – opcional)
- Gradle también
- PostgreSQL en ejecución y configuración con una base de datos (es decir, esquema, usuario, base de datos)
Necesitas lo siguiente build.gradle
si estas usando Gradle
o equivalente pom.xml
si estás usando 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'
}
}
Hay un montón de exclusiones en lo anterior. build.gradle
y eso es porque
- Primero excluir, instruye al gradle que excluye el
jdbc-tomcat
grupo de conexiones al descargar elspring-boot-starter-data-jpa
dependencias. Esto se puede lograr configurando elspring.datasource.type=com.zaxxer.hikari.HikariDataSource
también pero, no quiero una dependencia adicional si no la necesito - Segunda exclusión, indica a gradle que excluya
hibernate-core
al descargarcom.zaxxer
dependencia y eso es porquehibernate-core
ya está descargado porSpring Boot
y no queremos terminar con versiones diferentes. - Tercera excluir, indica a gradle que excluya
hibernate-core
al descargarhibernate-hikaricp
módulo que se necesita para hacer uso de HikariCPorg.hibernate.hikaricp.internal.HikariCPConnectionProvider
como proveedor de conexión en lugar de obsoletocom.zaxxer.hikari.hibernate.HikariConnectionProvider
Una vez que descubrí el build.gradle
y qué conservar y qué no, estaba listo para copiar / pegar un datasource
configuración en mi application.properties
y esperaba que todo funcionara con gran éxito, pero no realmente y me topé con los siguientes problemas
- Spring boot no puede encontrar los detalles de la base de datos (es decir, url, controlador), por lo tanto, no puedo configurar jpa e hibernar (porque no nombré correctamente los valores de clave de propiedad)
- HikariCP recurriendo a
com.zaxxer.hikari.hibernate.HikariConnectionProvider
- Después de indicarle a Spring que use un nuevo proveedor de conexión para cuando se configura automáticamente hibernate / jpa, HikariCP falló porque estaba buscando
key/value
en elapplication.properties
y se quejaba dedataSource, dataSourceClassName, jdbcUrl
. Tuve que depurar enHikariConfig, HikariConfigurationUtil, HikariCPConnectionProvider
y descubrí queHikariCP
no pude encontrar las propiedades deapplication.properties
porque fue nombrado de manera diferente.
De todos modos, aquí es donde tuve que confiar en prueba y error y asegurarme de que HikariCP
puede elegir las propiedades (es decir, la fuente de datos que es detalles de la base de datos, así como las propiedades de agrupación), así como Sping Boot se comporta como se esperaba y terminé con lo siguiente application.properties
expediente.
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
Como se muestra arriba, las configuraciones se dividen en categorías según los siguientes patrones de nomenclatura
- spring.datasource.x (La configuración automática de Spring los seleccionará, también lo hará HikariCP)
- spring.datasource.hikari.x (HikariCP elige estos para configurar el grupo, tome nota de los nombres de campo de camelCase)
- spring.jpa.hibernate.connection.provider_class (Le indica a Spring que use el nuevo HibernateConnectionProvider)
- spring.jpa.properties.hibernate.x (Utilizado por Spring para configurar automáticamente JPA, tome nota de los nombres de los campos con guiones bajos)
Es difícil encontrar un tutorial, una publicación o algún recurso que muestre cómo se usa el archivo de propiedades anterior y cómo se deben nombrar las propiedades. Bueno, ahí lo tienes.
Tirando lo de arriba application.properties
con build.gradle
(o al menos similar) en una versión de proyecto Spring Boot JPA (1.5.8) debería funcionar como un encanto y conectarse a su base de datos preconfigurada (es decir, en mi caso, es PostgreSQL que ambos HikariCP & Spring
averiguar a partir del spring.datasource.url
en qué controlador de base de datos utilizar).
No vi la necesidad de crear un DataSource
bean y eso es porque Spring Boot es capaz de hacer todo por mí con solo mirar en application.properties
y eso es genial.
El artículo en la wiki de github de HikariCP muestra cómo configurar Spring Boot con JPA, pero carece de explicación y detalles.
Los dos archivos anteriores también están disponibles como una esencia pública https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6
Simplemente puede hacer uso de application.yml / application.properties solamente. No es necesario crear explícitamente ningún DataSource
Frijol
Debe excluir tomcat-jdbc como lo menciona ydemartino
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>
Como no vas a crear DataSource
bean, debe especificar explícitamente el uso de Hikari a través de spring.datasource.type
con valor com.zaxxer.hikari.HikariDataSource
en application.yml / application.properties
spring:
datasource:
hikari:
connection-test-query: SELECT 1 FROM DUAL
minimum-idle: 1
maximum-pool-size: 5
pool-name: yourPoolName
auto-commit: false
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/myDb
username: login
password: password
type: com.zaxxer.hikari.HikariDataSource
En su application.yml / application.properties, puede configurar parámetros específicos de Hikari, como el tamaño del grupo, etc. spring.datasource.hikari.*