如何我在application.properties文件配置HikariCP在我的春天启动的应用程序?

问题描述 投票:61回答:14

我试图建立HikariCP我在春天启动(1.2.0.M1)应用程序,所以我可以测试到位的Tomcat DBCP的使用它。我想配置我application.properties连接池文件像我和Tomcat这样做,但我想不出我应该怎么做。所有的例子,我发现无论是表演风格JavaConfig,或使用一个单独的HikariCP属性文件。有人可以帮我找出属性名来配置它application.properties?我想也使用本driverClassName的方法来DataSourceClassName的方法,因为它看起来更清洁,建议切换。这也可以在我的application.properties文件(S)?

下面是我有什么Tomcat的DBCP(只是一些基本的配置,没有完全冲洗掉)

spring.datasource.validation-query=SELECT 1
spring.datasource.max-active=10
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=5
spring.datasource.test-on-borrow=true
spring.datasource.test-on-return=true

而我目前使用driverClassName和JDBC URL来建立连接:

spring.datasource.url=jdbc:mysql://localhost:3306/myDb
spring.datasource.driverClassName=com.mysql.jdbc.Driver
java spring spring-boot hikaricp
14个回答
114
投票
@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

更新!由于春季版1.3.0启动:

  1. 只需添加HikariCP到依赖性
  2. 配置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

更新!由于春季版2.0.0启动:

默认的连接池已经从Tomcat改为阿光:)


4
投票

这里是个好消息。 HikariCP是默认的连接使用Spring 2.0.0引导现在池。

spring.datasource.maximumPoolSize=20

在春季启动2.0池化技术的默认数据库已被从Tomcat池切换到HikariCP。我们发现,Hakari提供了卓越的性能,以及我们的许多用户喜欢它在Tomcat的游泳池。


4
投票

我使用Spring引导2.0.4.RELEASE。阿光是默认的连接池和Spring Boot 2.0.0 Release Notes不再是必要的。

application.properties

.hikari

application.yml

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.jdbcUrl=jdbc:mysql://localhost:3306/myDB...
spring.datasource.username=xxx
spring.datasource.password=xxx
spring.datasource.poolname=myPool

spring: datasource: driverClassName: com.mysql.jdbc.Driver jdbcUrl: jdbc:mysql://localhost:3306/myDB... username: xxx password: xxx poolName: myPool 并不需要延长configuration,并HikariConfig可以使用,因为它是以前。

DataSourceBuilder

2
投票

我的设置: 春季启动v1.5.10 阿光v.3.2.x(评估)

要真正了解阿光数据源的配置,我建议您禁用春天启动的自动配置为数据源。

添加以下内容application.properties:-

spring.autoconfigure.exclude = org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

这将禁用春天启动的配置自身的数据源的能力。

现在是你定义自己的自定义配置创建HikariDataSource豆和具有所需性能填充它的机会。

注意 ::: 公共类HikariDataSource扩展HikariConfig

你需要

  1. 使用所需的阿光属性填充HikariConfig对象
  2. 与作为参数传入构造HikariConfig对象初始化HikariDataSource对象。

我相信,在我定义自己的自定义配置类(@Configuration)在我自己创建数据源,并在一个单独的文件中定义的数据源属性填充它(比传统:application.properties) 通过这种方式,我可以使用Hibernate建议确定自己的SessionFactory的豆:“LocalSessionFactoryBean的”类,并与光速数据源>和其它的Hiberante-JPA属性填充它。

春天启动的基于汇总数据源光速特性: -

spring.datasource.hikari.allow池悬浮=真 spring.datasource.hikari.auto提交=假 spring.datasource.hikari.catalog = spring.datasource.hikari.connection-INIT-SQL = spring.datasource.hikari.connection测试查询= spring.datasource.hikari.connection超时= 100 spring.datasource.hikari.data源类名= spring.datasource.hikari.data源-J-正d-1 = spring.datasource.hikari.driver类名= spring.datasource.hikari.idle超时= 50 spring.datasource.hikari.initialization-快速失败=真 spring.datasource.hikari.isolate内部查询=真 spring.datasource.hikari.jdbc-URL = spring.datasource.hikari.leak检测阈值= spring.datasource.hikari.login超时= 60 spring.datasource.hikari.max-寿命= spring.datasource.hikari.maximum池大小= 500 spring.datasource.hikari.minimum空闲= 30 spring.datasource.hikari.password = spring.datasource.hikari.pool名= spring.datasource.hikari.read只=真 spring.datasource.hikari.register-的mbeans =真 spring.datasource.hikari.transaction隔离= spring.datasource.hikari.username = spring.datasource.hikari.validation超时=


2
投票

这将帮助任何人谁愿意来配置hikaricp他们带弹簧自动配置应用程序。对于我的项目,即时通讯使用的春天开机2 hikaricp作为JDBC连接池和MySQL作为数据库。有一件事我没有在其他的答案看到的是它可以用来设置所不具备的@Configuration public class DataSourceConfiguration { @Bean(name="myDataSource") @ConfigurationProperties("spring.datasource") public DataSource myDataSource() { return DataSourceBuilder.create().build(); } } 路径的不同性质的data-source-properties。这相当于使用spring.datasource.hikari.*类。要配置MySQL的具体性能我使用的弹簧自动配置注释,并在application.yml文件下列属性的数据源和hikaricp连接池。

HikariConfig您的配置文件中的bean之一。

application.yml文件可以是这样的。

@EnableAutoConfiguration

1
投票

随着春末引导版本切换到阿光在结构上可以完全做到。我使用spring: datasource: url: 'jdbc:mysql://127.0.0.1:3306/DATABASE?autoReconnect=true&useSSL=false' username: user_name password: password hikari: maximum-pool-size: 20 data-source-properties: cachePrepStmts: true prepStmtCacheSize: 250 prepStmtCacheSqlLimit: 2048 useServerPrepStmts: true useLocalSessionState: true rewriteBatchedStatements: true cacheResultSetMetadata: true cacheServerConfiguration: true elideSetAutoCommits: true maintainTimeStats: false 这种方法效果。

的build.gradle:

1.5.6.RELEASE

应用Yamla

compile "com.zaxxer:HikariCP:2.7.3"

更改spring: datasource: type: com.zaxxer.hikari.HikariDataSource hikari: idleTimeout: 60000 minimumIdle: 2 maximumPoolSize: 20 connectionTimeout: 30000 poolName: MyPoolName connectionTestQuery: SELECT 1 以满足您的底层数据库。就是这样,不需要任何代码。


23
投票

你可以简单地只利用application.yml / application.properties的。有没有必要明确创建任何DataSource

你需要排除的tomcat-JDBC通过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>

正如你不会创造DataSource豆,你必须通过与价值spring.datasource.type在application.yml / application.properties com.zaxxer.hikari.HikariDataSource用光速来明确指定

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

在你application.yml / application.properties,你可以配置阿光具体参数如池的大小等,在spring.datasource.hikari.*


21
投票

我碰到HikariCP,我被以基准惊讶,我想尝试它,而不是我的默认选择C3P0让我吃惊我挣扎着,因为配置有所不同根据您所使用的技术栈的组合,以获得configurations正确的可能。

我有Spring Boot起动器(使用JPA, Web, Security)设置Spring Initializer项目使用PostgreSQLHikariCP连接池的数据库。 我已经使用Gradle作为构建工具,我想与大家分享什么工作对我来说以下假设:

  1. 春天开机启动JPA(网络与安全 - 可选)
  2. 摇篮建太多
  3. PostgreSQL的运行和设置与数据库(即模式,用户,分贝)

你,如果你正在使用build.gradle或同等Gradle如果你正在使用maven需要以下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')

    // 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一堆排除了那是因为

  1. 首先排除,指示gradle这个是下载jdbc-tomcat依赖时排除spring-boot-starter-data-jpa连接池。这可以通过还设置了spring.datasource.type=com.zaxxer.hikari.HikariDataSource但可以实现,我不想额外的依赖,如果我不需要它
  2. 其次排除,指示gradle这个下载hibernate-core依赖时要排除com.zaxxer那是因为hibernate-core已经被Spring Boot下载,我们不想与不同版本的结束。
  3. 三排除,指示gradle这个下载这是必要的,以使HikariCP使用hibernate-core作为连接提供商,而不是过时的hibernate-hikaricporg.hibernate.hikaricp.internal.HikariCPConnectionProvider模块时要排除com.zaxxer.hikari.hibernate.HikariConnectionProvider

一旦我想通了build.gradle和如何保持,哪些不,我正准备复制/粘贴datasource配置到我application.properties和预期都出色地工作,但,不是真的,我偶然发现了以下问题

  • 春天开机未能找出数据库的详细信息(即URL,驱动程序),因此,不能够建立JPA和休眠(因为我没有名字属性键值右)
  • HikariCP回落至com.zaxxer.hikari.hibernate.HikariConnectionProvider
  • 指示Spring使用新的连接提供商时自动配置休眠/ JPA然后HikariCP失败,因为它一直在寻找的key/value一些application.properties并抱怨dataSource, dataSourceClassName, jdbcUrl后。我不得不调试到HikariConfig, HikariConfigurationUtil, HikariCPConnectionProvider并发现HikariCP无法找到application.properties的属性,因为它被命名不同。

无论如何,这是我不得不依靠试验和错误,并确保HikariCP能够挑选特性以及自旋微观启动像预期的那样,我结束了(这是DB的详细信息,以及统筹性,即数据源)具有以下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(弹簧自动配置会挑选这些,所以将HikariCP)
  • spring.datasource.hikari.x(HikariCP挑选这些设置水池,请记下驼峰字段名)
  • 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豆那是因为春天的引导能够做的一切对我来说只是寻找到application.properties,这就是整洁。

在HikariCP的github上articlewiki显示了如何设置弹簧引导与JPA但是,缺乏解释和细节。

上述两个文件也可作为一个公众要点qazxsw POI


7
投票

你不需要多余的代码将属性值的变量。有一个属性文件直接可以设置属性。

https://gist.github.com/rhamedy/b3cb936061cc03acdfe21358b86a5bc6文件中的类路径。

hikari.properties

并进行数据源豆这样。

driverClassName=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/myDb
connectionTestQuery=SELECT 1
maximumPoolSize=20
username=...
password=...

7
投票

这种情况下,它有助于适合我的启动应用程序。该类告诉你什么属性配置对象正在寻找:

@Bean(destroyMethod = "close") public DataSource dataSource() throws SQLException { HikariConfig config = new HikariConfig("/hikari.properties"); HikariDataSource dataSource = new HikariDataSource(config); return dataSource; }

我认为,多个数据源可以通过添加https://github.com/brettwooldridge/HikariCP/blob/2.3.x/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java在源配置文件中的属性键来支撑。干杯!

datasource_whatever

6
投票

您可以使用dataSourceClassName方法,这里是与MySQL的例子。 (测试与弹簧引导1.3和1.4)

首先,你需要从classpath排除Tomcat的JDBC,因为这将有利于hikaricp来采摘。

pom.hml

@Configuration
class DataSourceConfig {

   @Value('${spring.datasource.username}')
   private String user;

   @Value('${spring.datasource.password}')
   private String password;

   @Value('${spring.datasource.url}')
   private String dataSourceUrl;

   @Value('${spring.datasource.dataSourceClassName}')
   private String dataSourceClassName;

   @Value('${spring.datasource.connectionTimeout}')
   private int connectionTimeout;

   @Value('${spring.datasource.maxLifetime}')
   private int maxLifetime;

   @Bean
   public DataSource primaryDataSource() {
      Properties dsProps = [url: dataSourceUrl, user: user, password: password]
      Properties configProps = [
            connectionTestQuery: 'select 1 from dual',
            connectionTimeout: connectionTimeout,
            dataSourceClassName: dataSourceClassName,
            dataSourceProperties: dsProps,
            maxLifetime: maxLifetime
      ]

      // A default max pool size of 10 seems reasonable for now, so no need to configure for now.
      HikariConfig hc = new HikariConfig(configProps)
      HikariDataSource ds = new HikariDataSource(hc)
      ds
   }
}

application.properties

    <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>

然后,只需添加

spring.datasource.dataSourceClassName=com.mysql.jdbc.jdbc2.optional.MysqlDataSource
spring.datasource.dataSourceProperties.serverName=localhost
spring.datasource.dataSourceProperties.portNumber=3311
spring.datasource.dataSourceProperties.databaseName=mydb
spring.datasource.username=root
spring.datasource.password=root

我创建了一个测试项目位置:@Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource() { return DataSourceBuilder.create().build(); }


6
投票

由@Andy威尔金森说你不能使用dataSourceClassName方法在application.properties配置。如果你想有dataSourceClassName反正你可以使用Java配置为:

https://github.com/ydemartino/spring-boot-hikaricp

原因你不能使用dataSourceClassName,因为它会抛出和异常

@Configuration
@ComponentScan
class DataSourceConfig {

 @Value("${spring.datasource.username}")
private String user;

@Value("${spring.datasource.password}")
private String password;

@Value("${spring.datasource.url}")
private String dataSourceUrl;

@Value("${spring.datasource.dataSourceClassName}")
private String dataSourceClassName;

@Value("${spring.datasource.poolName}")
private String poolName;

@Value("${spring.datasource.connectionTimeout}")
private int connectionTimeout;

@Value("${spring.datasource.maxLifetime}")
private int maxLifetime;

@Value("${spring.datasource.maximumPoolSize}")
private int maximumPoolSize;

@Value("${spring.datasource.minimumIdle}")
private int minimumIdle;

@Value("${spring.datasource.idleTimeout}")
private int idleTimeout;

@Bean
public DataSource primaryDataSource() {
    Properties dsProps = new Properties();
    dsProps.put("url", dataSourceUrl);
    dsProps.put("user", user);
    dsProps.put("password", password);
    dsProps.put("prepStmtCacheSize",250);
    dsProps.put("prepStmtCacheSqlLimit",2048);
    dsProps.put("cachePrepStmts",Boolean.TRUE);
    dsProps.put("useServerPrepStmts",Boolean.TRUE);

    Properties configProps = new Properties();
       configProps.put("dataSourceClassName", dataSourceClassName);
       configProps.put("poolName",poolName);
       configProps.put("maximumPoolSize",maximumPoolSize);
       configProps.put("minimumIdle",minimumIdle);
       configProps.put("minimumIdle",minimumIdle);
       configProps.put("connectionTimeout", connectionTimeout);
       configProps.put("idleTimeout", idleTimeout);
       configProps.put("dataSourceProperties", dsProps);

   HikariConfig hc = new HikariConfig(configProps);
   HikariDataSource ds = new HikariDataSource(hc);
   return ds;
   }
  } 

这意味着春天启动从spring.datasource.url财产的驱动程序和同时设置dataSourceClassName推断造成此异常。为了让您的权利应该application.properties这个样子了HikariCP数据源:

Caused by: java.lang.IllegalStateException: both driverClassName and dataSourceClassName are specified, one or the other should be used.

注:请检查是否有在类路径中任何的tomcat-了jdbc.jar或公地dbcp.jar添加大部分的时间通过传递依赖。如果这些都存在于类路径春季启动将配置数据源使用默认的连接池是tomcat的。 HikariCP将只用于创建数据源如果在classpath中没有其他的供应商。有从Tomcat回退序列 - >到HikariCP - >到共享DBCP。


6
投票

根据该文件被改变,

# hikariCP spring.jpa.databasePlatform=org.hibernate.dialect.MySQLDialect spring.datasource.url=jdbc:mysql://localhost:3306/exampledb spring.datasource.username=root spring.datasource.password= spring.datasource.poolName=SpringBootHikariCP spring.datasource.maximumPoolSize=5 spring.datasource.minimumIdle=3 spring.datasource.maxLifetime=2000000 spring.datasource.connectionTimeout=30000 spring.datasource.idleTimeout=30000 spring.datasource.pool-prepared-statements=true spring.datasource.max-open-prepared-statements=250

例如:

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html

这是下面的配置变化,我们可以在光速号做的,请根据你的需要添加/更新。

spring:
    datasource:
        url: 'jdbc:mysql://localhost/db?useSSL=false'
        username: root
        password: pass
        driver: com.mysql.jdbc.Driver
        hikari:
            minIdle: 10
            idle-timeout: 10000
            maximumPoolSize: 30

4
投票

所以,事实证明,几乎所有除DB连接数,我HikariCP工作的默认设置。我设置我的application.properties该属性:

autoCommit
connectionTimeout
idleTimeout
maxLifetime
connectionTestQuery
connectionInitSql
validationTimeout
maximumPoolSize
poolName
allowPoolSuspension
readOnly
transactionIsolation
leakDetectionThreshold

和安迪·威尔金森是正确的,因为据我可以告诉的,你不能使用弹簧引导以HikariCP的dataSourceClassName配置方法。

© www.soinside.com 2019 - 2024. All rights reserved.