HikariCP连接池

HikariCP连接池是高性能的JDBC连接池,官网标注的三大特点:快速、简单、可靠,性能优于其他连接池。

官网详细地说明了HikariCP所做的一些优化,总结如下:

  • 字节码精简:优化代码,直到编译后的字节码最少(展平继承层次结构,掩饰成员变量,消除强制类型转换),这样,CPU缓存可以加载更多的程序代码;
  • 优化代理和拦截器:减少代码,例如HikariCP的Statement proxy只有100行代码,只有BoneCP的十分之一;
  • 自定义数组类型(FastStatementList)代替ArrayList:避免每次get()调用都要进行range check,避免调用remove()时的从头到尾的扫描;
  • 自定义无锁集合类型(ConcurrentBag):提高并发读写的效率;

HikariCP的使用

由于SpringBoot2默认集成HikariCP,因此需要再引入依赖。主要是项目mysql和springboot mybatis的依赖。

Yaml配置

# 配置数据源信息
spring:
  datasource:                                           # 数据源的相关配置
    type: com.zaxxer.hikari.HikariDataSource          # 数据源类型:HikariCP
    driver-class-name: com.mysql.jdbc.Driver          # mysql驱动
    url: jdbc:mysql://localhost:3306/foodie-dev?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
    username: root
    password: 123456
    hikari:
      connection-timeout: 30000        # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认:30秒
      minimum-idle: 5                  # 最小连接数
      maximum-pool-size: 20            # 最大连接数
      auto-commit: true                # 事务自动提交
      idle-timeout: 600000             # 连接超时的最大时长(毫秒),超时则被释放(retired),默认:10分钟
      pool-name: DateSourceHikariCP     # 连接池名字
      max-lifetime: 1800000             # 连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟 1800000ms
      connection-test-query: SELECT 1  # 连接测试语句
# mybatis配置
mybatis:
  type-aliases-package: com.lzp.pojo          # 所有POJO类所在包路径
  mapper-locations: classpath:mapper/*.xml      # mapper映射文件

连接池连接数的设置

引入数据库连接池

数据库连接是有限的、昂贵的资源,一个数据库连接对象对应一个物理数据库的连接,如果每次数据库操作都创建新的连接,使用完后释放,会导致系统性能低下,这就引出了连接池的概念。

数据库连接池是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,可以视作一个存放数据库连接的容器。

数据库连接池采用了资源池设计模式,用于资源共享,避免资源的频繁分配与释放问题。同时便于统一管理,可以通过对连接池的控制,限制系统与数据库的连接,监视数据库的连接数量和使用情况。

连接池的必要性

1、不使用连接池流程

下面以访问MySQL为例,执行一个SQL命令,如果不使用连接池,需要经过哪些流程。

不使用数据库连接池的步骤:

  1. TCP建立连接的三次握手
  2. MySQL认证的三次握手
  3. 真正的SQL执行
  4. MySQL的关闭
  5. TCP的四次握手关闭

可以看到,为了执行一条SQL,却多了非常多网络交互。
优点:实现简单
缺点:

  • 网络IO较多
  • 数据库的负载较高
  • 响应时间较长及QPS较低
  • 应用频繁的创建连接和关闭连接,导致临时对象较多,GC频繁
  • 在关闭连接后,会出现大量TIME_WAIT 的TCP状态(在2个MSL之后关闭)

2、使用连接池流程

使用数据库连接池的步骤:

第一次访问的时候,需要建立连接。 但是之后的访问,均会复用之前创建的连接,直接执行SQL语句。
优点:

  • 较少了网络开销
  • 系统的性能会有一个实质的提升
  • 没了麻烦的TIME_WAIT状态

数据库连接数设置

系统可采取设置最小连接数和最大连接数等参数来控制连接池中的连接。最小连接数是系统启动时创建的数据库连接数。最小连接数小,则启动快,响应慢。通常设置较大一些。最小连接数可以设置为5个-10个。最大连接数根据硬件配置设置,4核心机器可以设为10个,8核心可以设为20个。

HikariCP的默认的最大和最小连接数是10。作者建议是设置最大和最小连接数为相同的值,维护一个高性能连接池。

为什么连接池数并不是越大越好?

第一点,首先我们要知道单核CPU“同时”运行多个线程,只不过是假象。单核CPU同一时刻只能执行一个线程,然后操作系统切换上下文,CPU 核心快速调度,执行另一个线程的代码。这其中便涉及到了大量上下文切换带来的额外性能损耗。

第二点,由上可知,一个N核心服务器,设置数据库连接数为N便能提供最优性能。然而,实际情况会受到磁盘IO和网络IO的影响,在IO等待时间内,线程阻塞等待,CPU处于空闲状态。因此,在线程处理I/O密集业务操作时,需要设置线程/连接数比CPU大一些,以提高吞吐量。

连接数的计算公式

连接数 = ((核心数 * 2) + 有效磁盘数)

服务器 CPU 是 4核 i7 的,连接池大小应该为 ((4 * 2) + 1) = 9 ~ 10个。具体需要根据实际业务场景做调整。

  • 对于并发访问,可以采用小的数据库连接池,然后将剩下的业务线程放在队列中等待。
  • 如果系统中混合了长事务和短事务,正确的做法应该是创建两个连接池,一个服务于长事务,一个服务于"实时"查询,也就是短事务。
  1. https://www.jianshu.com/p/15b846107a7c
  2. https://www.cnblogs.com/cocoxu1992/p/11031908.html
  3. https://blog.csdn.net/weiwosuoai/article/details/89955003
今天遇到了关于据源连接池配置的问题,发现有很多种方式可以配置,现总结如下,希望对大家有所帮助:(已Mysql据库为例) 一,Tomcat配置据源: 方式一:在WebRoot下面建文件夹META-INF,里面建一个文件context.xml,内容如下:           maxActive="50" maxIdle="30" maxWait="10000" logAband 1、数据库连接池介绍 据库连接是一种有限的昂贵资源,建立一个据库连接需要消耗大量的系统资源,频繁创建据库连接会大大消弱系统性能,鉴于此,并不是每个用户都创建并独占一个据库连接,而是通过连接池对连接进行管理。 数据库连接池负责分配、管理和释放据库连接,允许应用程序重复使用一个现有的据库连接,而不是重新建立一个,明显提高对据库操作的性能。 2.DBCP的属性 initialSize :连接池启动时创建的初始化连接量(默认值为0)  maxActive :连接池中可同时连接的最大的连接(默认值为8,调整为20 ) maxIdle:连接池中最大的空闲的连接,超过的空闲连接将被释放 http://tomhat.iteye.com/blog/1141117 initialSize :连接池启动时创建的初始化连接量(默认值为0) maxActive :连接池中可同时连接的最大的连接(默认值为8,调整为20,高峰单机器在20并发左右,自己根据应用场景定) maxIdle:连接池中最大的空闲的连接,超过的空闲连接将被释放,如果设置为负表示不限制(默认为8个,maxId HikariCP用来控制连接时间的配置主要有:idleTimeout(空闲时间)、maxLifetime(最长时间) idleTimeout:用来控制连接在连接池中空闲的时间。 maxLifetime:用来控制连接在连接池中最大的生命周期。 idleTimeout 空闲时间默认设置为600000毫秒(10分钟)。 配置生效的时机 当minimumIdle小于maximumPoolSize的时候,HikariCP才开始进行空闲连接的判断,这个时候idle 测试代码: ExecutorService executor = Executors.newFixedThreadPool(20); for (int i = 0; i < 20; i++) { executor.submit(new Runnable() { @Override public void run() { MySQL据库清理Sleep连接 Hikari连接池配置参考建议根据实际访问量设置setMaximumPoolSize,不宜过大,否则会造成据库连接太多,无法访问。生产环境和测试环境可区别设置,比如:测试环境设置10,生产环境设置20 // Hikari... 转载:https://blog.csdn.net/long690276759/article/details/82259550 <!-- Hikari Datasource --> spring: datasource: #192.168.1.161 username: password: type: com.zaxxer.hikari.HikariDataSource driver-class-name: {} 》》Redis:据库的名字 》》Jedis:工具类的名字 Jedis同样也是托管在github上,地址: https://github.com/xetorthio/jedis。 (2)如何搭建Jedis? 使用Jedis操作redis需要导入jar包如下 Jedis的操作 (1)Jedis如何使用? 操作步骤: 》》1:创建一个Jedis对象 》》 2:执行Redis指令 //1:创建Jedis对象 概述 HikariCP是Spring Framework 5.0的默认 数据库连接池,这得益于他的高性能。但是如果配置不当,数据库连接池也可能因影响到系统性能。 重要参 maximum-pool-size minimum-idle pool-name auto-commit idle-timeout max-lifetime connection-timeout 据库连接是一种关键的有限的昂贵的资源,这在多用户网页应用程序中体现的尤为突出.对据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标,数据库连接池正是针对这个问题提出的. 数据库连接池负责分配,管理和释放据库连接,它允许应用程序重复使用一个现有的据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的据库连接来避免因为没有释放据库连接而引起的据库连