一、概述:
数据库连接池是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。
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连接池示例: