数据库连接池是什么
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而
不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而
引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
用户痛点
- 如果不用连接池,每一次查询都需要建立连接,有两层握手。第一层是 TCP 层的握手,第二层是
MySQL 协议握手。两层协议大概需要有多个 TCP 数据包,这些都需要时间,在数据库内部还需要处理,
建立连接是费时间的操作
- 对于当代的应用来说,应用服务器一般有很多台,而数据库服务器相比之下可能少一些。大量应用服
务器会存在一个问题,在业务流量高峰期存在对 DB 的连接,而 DB 能够承载的连接数有限。所以说如果
不用连接池,那么这个连接的数量就不受控制,严重情况下可导致 DB 性能降低; - 如果不用连接池,意味着每次执行 SQL 语句时,都需要创建 TCL 链接和关闭 TCL 链接,而关闭动作是
在应用端完成,导致应用服务器上存在较多 TimeWait 状态的 TCP 连接。TimeWait 状态的连接数达到一定
数量之后会引起应用问题,例如端口不够用
为什么需要连接池
- 资源重用
由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础
上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程 / 线程的数量) - 更快的系统响应速度
数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作
均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时
间开销,从而缩减了系统整体响应时间。 - 新的资源分配手段
对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数据库连接池技术,
对于目前的业务系统而言,如果设计中还没有考虑到连接池的应用。可对某一应用最大可用数据库连接
数的限制,避免某一应用独占所有数据库资源。 - 统一的连接管理,避免数据库连接泄漏
在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免
了常规数据库连接操作中可能出现的资源泄漏。
常见的数据库连接池
数据库连接池配置参数解析
Hikari 连接池目前公认是性能最高的数据库连接池,同时也是 SpringBoot2.0 以后默认使用的数据库连接
池。
连接池使用踩坑
作为系统开发而言,目前的大多数数据库连接池都基本上做到了无感引入,一般的踩坑都出现在配置文
件中
- 配置文件中配置项错误
- 数据源驱动问题例如 mysql 的低版本 5.6 与 8.0 高版本驱动的区别 com.mysql.jdbc.Driver 改成
com.mysql.cj.jdbc.Driver