HikariCP 连接池

HikariCP 是一个快速、简单、可靠的 JDBC 连接池,在性能上做了很多优化,是目前最快的数据库连接池;本文主要介绍 HikariCP 的基本使用,文中使用到的软件版本:Java 1.8.0_191、HikariCP 4.0.3、Spring Boot 2.3.12.RELEASE。

1、配置参数

HikariCP 所有时间相关的参数单位都为 ms。

1.1、基本配置

参数默认值描述
dataSourceClassNamenone驱动里面数据源的类名称;不支持 XA数据源,各数据源对应的数据源类名可参见 ”2、数据源类名“
jdbcUrlnone连接 url;该参数与 dataSourceClassName 设置一个即可
usernamenone用户名
passwordnone密码

1.2、常用配置

参数默认值描述
autoCommittrue连接返回连接池时,是否自动提交事务
connectionTimeout30000从连接池获取连接的最大超时时间
idleTimeout60000空闲连接存活的最大时间,当空闲连接数>minimumIdle 且 连接的空闲状态时间>idleTimeout 时,将把该连接从连接池中删除;只有当 minimumIdle < maximumPoolSize 时,该设置才生效;0 表示永不超时
keepaliveTime 0保持空闲连接可用的检测频率,单位:ms;0 表示不检测
maxLifetime1800000连接存活的最大时间;0 表示没有限制
connectionTestQuerynone连接检测的查询语句;如果驱动支持 JDBC 4,强烈建议不要设置此参数
minimumIdlesame as maximumPoolSize最小空闲连接数;为了提高性能,建议不要设置此参数,使连接池为固定大小
maximumPoolSize10最大连接数
metricRegistrynone该参数仅通过编程配置或 IoC 容器可用;该参数用于指定池使用的 Codahale/Dropwizard MetricRegistry实例来记录各种指标。
healthCheckRegistrynone该参数仅通过编程配置或 IoC 容器可用;该参数用于指定池使用的 Codahale/Dropwizard HealthCheckRegistry实例来记录健康信息。
poolNameauto-generated连接池名称

1.3、不常用配置

参数默认值描述
initializationFailTimeout1启动连接池时不能成功初始化连接,是否快速失败。>0 时,会尝试获取连接。如果获取时间超过指定时长(connectionTimeout + initializationFailTimeout),不会开启连接池,并抛出异常。=0 时,会尝试获取并验证连接。如果获取成功但验证失败则不开启池,但是如果获取失败还是会开启池。<0 时,直接启动连接池,不进行初始化连接尝试。
isolateInternalQueriesfalse是否在事务中隔离 HikariCP 自己的查询;autoCommit 为 false 时,该设置生效
allowPoolSuspensionfalse是否允许通过 JMX 挂起和恢复连接池;挂起时获取连接不会超时,知道连接池恢复
readOnlyfalse连接是否只读
registerMbeansfalse是否开启 JMX
catalogdriver default默认的数据库 catalog
connectionInitSqlnone连接池初始化后执行的 SQL
driverClassNamenone驱动类名;HikariCP 会尝试通过 jdbcUrl 来确定 driverClassName,但对一些老的驱动必须指定 driverClassName;可以忽略该配置除非报 "the driver was not found" 的错误。
transactionIsolationdriver default默认的事务隔离级别
validationTimeout5000连接检测的超时时间;必须大于 connectionTimeout,最小允许的值为 250
leakDetectionThreshold0连接可以被借出多久;超过该时间将打印连接可能泄露的日志,最小允许的值为 2000,单位 ms
dataSourcenone指定数据源;此参数仅通过编程配置或 IoC 容器可用,当设置此参数,dataSourceClassName 和所有 DataSource- 相关的属性将被忽略。
schemadriver default 默认的数据库 schema
threadFactory none 指定连接池用于创建线程的 java.util.concurrent.ThreadFactory 实例;此参数仅通过编程配置或 IoC 容器可用
scheduledExecutornone指定连接池用于执行定时任务的 java.util.concurrent.ScheduledExecutorService 实例;此参数仅通过编程配置或 IoC 容器可用

详细的配置说明可参考官网文档:https://github.com/brettwooldridge/HikariCP

2、数据源类名

HikariCP 建议使用 dataSourceClassName 代替 jdbcUrl,但是两个都是支持的。

注:Spring Boot 基于自动配置,使用 jdbcUrl。
       MySQL 的 DataSource 不支持网络超时,使用 jdbcUrl 代替。

常用数据库的 JDBC 数据源类名如下:

DatabaseDriverDataSource class
Apache DerbyDerbyorg.apache.derby.jdbc.ClientDataSource
FirebirdJaybirdorg.firebirdsql.ds.FBSimpleDataSource
H2H2org.h2.jdbcx.JdbcDataSource
HSQLDBHSQLDBorg.hsqldb.jdbc.JDBCDataSource
IBM DB2IBM JCCcom.ibm.db2.jcc.DB2SimpleDataSource
IBM InformixIBM Informixcom.informix.jdbcx.IfxDataSource
MS SQL ServerMicrosoftcom.microsoft.sqlserver.jdbc.SQLServerDataSource
MySQLConnector/Jcom.mysql.jdbc.jdbc2.optional.MysqlDataSource
MariaDBMariaDBorg.mariadb.jdbc.MariaDbDataSource
OracleOracleoracle.jdbc.pool.OracleDataSource
OrientDBOrientDBcom.orientechnologies.orient.jdbc.OrientDataSource
PostgreSQLpgjdbc-ngcom.impossibl.postgres.jdbc.PGDataSource
PostgreSQLPostgreSQLorg.postgresql.ds.PGSimpleDataSource
SAP MaxDBSAPcom.sap.dbtech.jdbc.DriverSapDB
SQLitexerialorg.sqlite.SQLiteDataSource
SyBasejConnectcom.sybase.jdbc4.jdbc.SybDataSource

3、使用

3.1、直接使用

3.1.1、引入依赖
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>4.0.3</version>
</dependency>
3.1.2、使用例子

复制代码

package com.abc.demo.general.dbpool;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class HikariCPCase {
    private static Logger logger = LoggerFactory.getLogger(HikariCPCase.class);

    /**
     * 使用 dataSourceClassName
     */
    @Test
    public void test1() {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setPoolName("HikariCP 连接池");
        hikariConfig.setDataSourceClassName("oracle.jdbc.pool.OracleDataSource");
        hikariConfig.addDataSourceProperty("user", "test");
        hikariConfig.addDataSourceProperty("password", "123456");
        hikariConfig.addDataSourceProperty("url", "jdbc:oracle:thin:@10.49.196.10:1521:test");
        hikariConfig.setMaximumPoolSize(15);

        HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);
        Connection connection = null;
        try {
            connection = hikariDataSource.getConnection();
            Statement st = connection.createStatement();
            ResultSet rs = st.executeQuery("select * from v$version");
            if (rs.next()) {
                logger.info(rs.getString(1));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(connection);
        }

        //实际使用中一般是在应用启动时初始化数据源,应用从数据源中获取连接;并不会关闭数据源。
        hikariDataSource.close();
    }

    /**
     * 使用jdbc-url
     */
    @Test
    public void test2() {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setPoolName("HikariCP 连接池");
        hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
        hikariConfig.setJdbcUrl("jdbc:mysql://10.49.196.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8");
        hikariConfig.setUsername("root");
        hikariConfig.setPassword("123456");
        hikariConfig.setMinimumIdle(2);
        hikariConfig.setMaximumPoolSize(10);

        HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);
        Connection connection = null;
        try {
            connection = hikariDataSource.getConnection();
            Statement st = connection.createStatement();
            ResultSet rs = st.executeQuery("select version()");
            if (rs.next()) {
                logger.info(rs.getString(1));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(connection);
        }

        //实际使用中一般是在应用启动时初始化数据源,应用从数据源中获取连接;并不会关闭数据源。
        hikariDataSource.close();
    }

    private static void close(Connection connection) {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

复制代码

3.2、在 SpringBoot 中使用

3.2.1、引入依赖

复制代码

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.12.RELEASE</version>
    <relativePath />
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
    </dependency>

    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>4.0.3</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

复制代码

3.2.2、单数据源

application.yml 配置:

复制代码

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://10.140.9.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 123456
    #type: com.zaxxer.hikari.HikariDataSource
    hikari:
      maximum-pool-size: 15

复制代码

使用:

@Autowired
private DataSource dataSource;
3.2.3、多数据源

application.yml 配置:

复制代码

spring:
  datasource:
    hikari:
      db1:
        pool-name: 连接池1
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://10.49.196.11:3306/mydb?useUnicode=true&characterEncoding=UTF-8
        username: root
        password: 123456
        maximum-pool-size: 15
      db2:
        pool-name: 连接池2
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://10.49.196.12:3306/mydb?useUnicode=true&characterEncoding=UTF-8
        username: root
        password: 123456
        maximum-pool-size: 15

复制代码

数据源配置类:

复制代码

package com.abc.demo.config;

import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;


@Configuration
public class DataSourceConfig {
    @Primary
    @Bean(name = "dataSource1")
    @ConfigurationProperties("spring.datasource.hikari.db1")
    public DataSource dataSourceOne(){
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

    @Bean(name = "dataSource2")
    @ConfigurationProperties("spring.datasource.hikari.db2")
    public DataSource dataSourceTwo(){
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }
}

复制代码

使用:

复制代码

@Autowired
@Qualifier("dataSource1")
private DataSource dataSource1;

@Autowired
@Qualifier("dataSource2")
private DataSource dataSource2;

复制代码

对于HikariCP连接池,动态密码可以通过以下步骤实现: 1. 首先,添加HikariCP和MyBatis-Plus的依赖到你的项目中。 2. 在配置文件(比如application.properties或application.yml)中配置HikariCP连接池的相关参数,比如数据库URL、用户名、初始密码等。将密码字段设置为占位符,例如:`spring.datasource.password=placeholder`. 3. 在项目启动时,通过编程方式获取到真实的密码,并将其设置到HikariCP连接池的配置中。 4. 可以使用Spring的事件机制,在应用启动时监听事件,在事件监听器中获取真实密码并设置到HikariCP连接池配置中。 下面是一个示例代码: ```java @Component public class HikariPasswordListener implements ApplicationListener<ApplicationReadyEvent> { @Autowired private HikariDataSource dataSource; @Override public void onApplicationEvent(ApplicationReadyEvent event) { // 获取真实密码的逻辑,可以从配置文件、数据库或其他安全存储中获取 String realPassword = "your_real_password"; // 设置真实密码到HikariCP连接池配置中 dataSource.setPassword(realPassword); } } ``` 在上述示例中,我们创建了一个监听器 `HikariPasswordListener`,并在应用启动时监听 `ApplicationReadyEvent` 事件。在监听器中,我们注入了 `HikariDataSource` 对象,并获取真实的密码。然后将真实密码设置到 `HikariDataSource` 对象的密码字段中。 这样,HikariCP连接池就可以使用动态密码了。注意,示例中使用了Spring的事件机制,如果你的项目没有使用Spring,可以考虑使用其他适合的方式来设置真实密码到HikariCP连接池配置中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值