一、概述:

数据库连接池是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。

1.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕后放回去。

2.数据库连接池负责分配、管理和释放数据库连接,它允许程序重复使用一个现有连接,而不是重新建立一个。

3.当应用程序连接向连接池请求数量超过最大数量时,这些请求将被加入到等待队列。

数据库连接池示意图:

二、工作原理

连接池的工作原理主要由三部分组成,分别为:连接池的建立;连接池中连接的使用管理;连接池的关闭;

(1)连接池的建立

一般在系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象,以便使用时能从连接池中获取。连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。Java中提供了很多容器类可以方便的构建连接池,例如Vector、Stack等。

(2)连接池的管理

连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其管理策略是:

[1] 当客户请求数据库连接时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。

[2] 当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接(主要是防止该对象不断的使用资源,导致别的用户都可能因资源有限而排队,所以要轮流享受资源),否则保留为其他客户服务。

该策略保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源开销。

(3)连接池的关闭

当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。

三、项目中使用的连接池工具HikariDataSource:

HikariDataSource是springBoot自带的数据源管理工具。

配置详解:

1>#数据源类型

spring.datasource.type=com.zaxxer.hikari.HikariDataSource

2>#连接池名称,默认HikariPool-1

spring.datasource.hikari.pool-name=KevinHikariPool

3>#最大连接数,小于等于0会被重置为默认值10;大于零小于1会被重置为minimum-idle的值

spring.datasource.hikari.maximum-pool-size=12

4>#连接超时时间:毫秒,小于250毫秒,否则被重置为默认值30秒

spring.datasource.hikari.connection-timeout=60000

5>#最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size

spring.datasource.hikari.minimum-idle=10

6>#空闲连接超时时间,默认值600000(10分钟),大于等于max-lifetime且max-lifetime>0,会被重置为0;不等于0且小于10秒,会被重置为10秒。

# 只有空闲连接数大于最大连接数且空闲时间超过该值,才会被释放

spring.datasource.hikari.idle-timeout=500000

7>#连接最大存活时间.不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短

spring.datasource.hikari.max-lifetime=540000

8>#连接测试查询

spring.datasource.hikari.connection-test-query=SELECT 1

四、其他常用连接池:

1.JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,该接口通常由第三方提供实现

2.C3P0数据库连接池,速度相对较慢,稳定性好,

3.DBCP数据库连接池,速度相对C3P0较好,但不稳定

4.Proxool数据库连接池,有监控连接池状态的功能,稳定性较C3P0差一点

5.BoneCP数据库连接池,速度快

6.Druid(德鲁伊)是阿里提供的数据库连接池,集合DBCP、C3P0、Proxool优点于一体的数据库连接池

SpringBoot配置Druid连接池示例: