springboot 数据库连接池配置(hikari)
作者:mmseoamin日期:2023-12-18

JBDC

        JABC是JAVA访问关系型数据库的标注API,它为各种关系型数据的访问提供统一的接口标准,然后,各个关系型数据库厂商按照JBDC的标准,提供能使JAVA访问的驱动包。一般情况下,在JAVA中执行一条SQL语句,需要以下几个步骤:

  1. 状态JDBC驱动程序
  2. 建立数据库连接
  3. 创建数据库操作对象
  4. 访问数据库,执行SQL语句
  5. 处理返回结果集
  6. 断开数据库连接

其中第2步的连接需经历一下步骤:

  1. 与数据建立TCP连接的三次握手
  2. 数据库账号密码认证的通信
  3. sql执行与返回的通信
  4. 关闭TCP连接的4次握手

        由此看出,执行一个sql的开销是比较大的,因此,为了节省资源提高效率,使用数据库连接池是很有必要的

数据库连接池

        顾名思义,数据库连接池就是存放很多数据库连接的池子。它的原理就是在系统初始化的时候创建一定数量的数据库连接并存放在池子中,当应用程序需要访问数据库时,直接从池子里面拿空闲连接使用,使用完成连接也不用关闭,给后续要访问数据库的线程继续使用。这样就能很大程度上节省了访问数据库的时间和重复建立连接的资源占用。数据库连接池有一下几个关键因素:

  • 最小连接数:限制数据库连接池保持数据连接的最小数量,如果应用访问数据的频率不是很高,将造成资源浪费。
  • 最大连接数:当同一时间应用向数据库连接池请求的数连接超过最小连接数,将新增一个请求,新增的连接空闲后不会马上释放,当超过设置的空闲时间后才会自动释放,当请求超过最大连接数时,进入等待队列,直到有空闲的连接。

    hikari配置

            springboot默认使用的是hikari连接池,常用配置如下,参考地址HikariCP

    属性名称说明
    autoCommit

    控制从池返回的连接是否默认自动提交。

    默认值:true

    connectionTimeout

    客户端向池子请求连接的超时时间,超出则抛出一个SQLException。

    最小值:250毫秒。

    默认值:30000毫秒

    maximumPoolSize

    控制池允许达到的最大大小,包括两者空闲和正在使用的连接。

    基本上这个值将决定的最大数量到数据库后端的实际连接。当池达到此大小,并且没有空闲连接时可用时,对请求连接的调用将阻塞长达connectionTimeout的毫秒。

    默认值:10

    minimumIdle

    控制HikariCP试图维护的空闲连接的最小数量。如果空闲连接数低于此值,并且池中的总连接数小maximumPoolSize,HikariCP将尽最大努力快速有效地添加额外的连接。然而,为了获得最大的性能和对峰值需求的响应,建议不要设置此值,而是允许HikariCP作为固定大小的连接池。

    默认值:与maximumPoolSize相同

    idleTimeout

    控制连接在池中允许空闲的最长时间。该设置仅在minimumIdle小于maximumPoolSize时适用。一旦池达到最低空闲连接数,空闲连接将不会被弃用。无论连接是否作为空闲状态,其弃用时间都可能在+30秒的范围内变化,平均变化为+15秒。在超时时间之前,连接永远不会被弃用为空闲连接。如果将其设置为0,则表示不会从池中删除空闲连接。

    最小允许值为10000毫秒(10秒)。

    默认值为600000(10分钟)。

    maxLifetime

    控制连接池中连接的最长生命周期。使用中的连接永远不会被弃用,只有当它被关闭时才会被移除。针对每个连接,应用轻微的负面衰减,以避免连接池的大规模灭绝。

    我们强烈建议设置此值,应该比数据库或基础设施强制实施的连接时间限制短几秒钟。如果将其设置为0,则表示没有最大生命周期(无限生命周期),当然还要考虑idleTimeout设置。

    最小允许值为30000ms(30秒)。

    默认值为1800000(30分钟)。

    keepaliveTime

    控制HikariCP尝试保持连接的频率,以防止连接因数据库或网络基础设施的超时而被关闭。该属性仅适用于空闲连接,keepaliveTime的值必须小于maxLifetime的值。

    当给定连接需要进行“保活”操作时,该连接将从连接池中移除,执行“ping”操作,然后返回连接池。ping操作可以通过调用JDBC4的isValid()方法或执行connectionTestQuery来执行。离开连接池的时间应该通常为单个数字毫秒甚至是亚毫秒,因此应该几乎没有性能影响。

    keepaliveTime属性的最小允许值为30000毫秒(30秒),但在几分钟的范围内设置值最理想。keepaliveTime的默认值为0,这意味着默认情况下禁用此功能。

    connectionTestQuery

    如果您的驱动程序支持JDBC4,我们强烈建议不要设置此属性。这是为了

    不支持JDBC4 Connection.isValid() API的“遗留”驱动程序。这是一个查询

    将在连接池提供给您之前执行,以验证

    到数据库的连接仍然活着。再次尝试在没有这个属性的情况下运行池,

    如果您的驱动程序不符合JDBC4, HikariCP将记录一个错误,让您知道。

    默认值:无

    metricRegistry

    此属性只能通过编程配置或IoC容器使用。这个属性允许你指定一个Codahale/Dropwizard MetricRegistry的实例用于池来记录各种指标。

    默认值:无

    healthCheckRegistry

    此属性只能通过编程配置或IoC容器使用。这个属性允许你指定一个Codahale/Dropwizard HealthCheckRegistry的实例

    用于报告当前运行状况信息的池。

    默认值:无

    poolName

    表示连接池的用户定义名称,主要出现在在日志记录和JMX管理控制台中识别池和池配置。

    默认值:自动生成

    springboot的hikari配置示例

    spring:
      #JDBC
      datasource:
        #JDB连接池配置
        hikari:
          pool-name: spring-demo-1 #连接池名称
          connection-timeout: 60000 #请求连接的超时时间
          maximum-pool-size: 20 #最大连接数量
          max-lifetime: 1800000 #连接的最长生命周期
          keepalive-time: 1750000 #尝试保持连接的频率
          connection-test-query: select 1 #连接验证sql