当前位置: 首页 > news >正文

连接 连接池完整详解(以数据库连接最常用,Redis/MQ 同理)

目录

一、基础概念:什么是「连接」

1. 连接本质

2. 单次创建连接的成本(为什么不能频繁新建)

3. 直连模式(无连接池)流程

二、连接池(Connection Pool)核心定义

核心运作逻辑

三、连接池关键配置参数(以 HikariCP、Druid 主流连接池为例)

1. 核心四大参数

2. 附加配置

四、连接池里三种连接状态

五、常见问题:连接泄露、连接耗尽

1. 连接泄露

2. 连接池耗尽(连接打满)

六、主流连接池对比(Java)

七、不止数据库:Redis / 消息队列也有连接池

八、补充:数据库服务端连接参数(MySQL 视角)


一、基础概念:什么是「连接」

1. 连接本质

连接 = 客户端 ↔ 服务端 之间建立的 TCP 网络链路 + 服务端分配的资源句柄以 MySQL 举例:

  1. 应用发起 TCP 三次握手,和 MySQL 服务建立 Socket 通信;
  2. MySQL 创建线程、分配内存、权限校验、初始化会话环境(事务隔离级别、字符集、临时变量);
  3. 这条链路就是数据库连接 Connection,所有 SQL 执行都基于这条连接收发报文。

2. 单次创建连接的成本(为什么不能频繁新建)

  1. 网络开销:TCP 握手、DNS 解析、往返 IO;
  2. 服务端资源开销:MySQL 创建工作线程、分配内存、权限认证;
  3. 销毁开销:用完关闭连接时,TCP 四次挥手、服务端回收线程内存。

短业务频繁new Connection() + close():创建销毁耗时远大于 SQL 执行,高并发下直接拖垮 DB。

3. 直连模式(无连接池)流程

请求→新建连接→执行SQL→关闭连接→释放资源

缺点:高并发频繁创建销毁、瞬时连接数暴涨打爆数据库 max_connections。

二、连接池(Connection Pool)核心定义

连接池是提前初始化一批数据库连接,放在容器中缓存复用的资源管理器

思想:连接复用,避免频繁创建销毁连接,是中间缓存思想的落地(池化技术:线程池、对象池、内存池同理)。

核心运作逻辑

  1. 初始化:启动时预先创建minIdle(最小空闲数)个连接,存入空闲队列;
  2. 借连接(获取):业务需要连接时,优先从空闲队列取空闲连接;
    • 空闲有连接:直接取出使用;
    • 空闲无连接:若当前总连接 <maxTotal (最大连接) → 新建连接;
    • 总连接已达上限:阻塞等待 / 直接抛出超时异常(由配置决定);
  3. 还连接(归还):业务close()不是销毁连接,归还到空闲队列
  4. 保活 / 淘汰:后台定时线程,剔除空闲过久、失效坏连接,补充空闲连接至最小空闲数。
请求→从池子拿空闲连接→执行SQL→归还连接到池子(不销毁)

三、连接池关键配置参数(以 HikariCP、Druid 主流连接池为例)

1. 核心四大参数

参数含义
minimumIdle(minIdle)最小空闲连接:池子常驻保活的空闲连接,避免冷启动反复创建
maximumPoolSize(maxTotal)最大连接数:池子能创建的连接上限,决定数据库瞬时并发连接峰值
idleTimeout空闲超时:空闲连接超过该时间自动被回收(低于 minIdle 则不回收)
connectionTimeout获取连接超时:业务从池子拿连接等待的最长时间,超时抛异常

2. 附加配置

  • maxLifetime:连接生命周期,所有连接到达生命周期强制销毁换新(规避 DB 侧被动断开的无效连接);
  • testOnBorrow/testWhileIdle:借连接时 / 空闲巡检时,用select 1探测连接是否存活,剔除断连坏连接。

四、连接池里三种连接状态

  1. 空闲连接(Idle):在池子队列待命,未被业务占用;
  2. 活跃连接(Active/Busy):已经被业务借出,正在执行 SQL / 事务;
  3. 废弃连接(Dead):TCP 断连、服务端被 kill、异常失效,被健康检测剔除销毁。

总连接数 = 空闲连接数 + 活跃连接数 ≤ maximumPoolSize

五、常见问题:连接泄露、连接耗尽

1. 连接泄露

拿到连接忘记归还(没 close / 没释放)场景:代码异常没 finally 关闭连接、事务卡住未提交。 后果:活跃连接只增不减,空闲连接逐步归零,后续请求拿不到连接,报get connection timeout。 解决:try-with-resources 自动关闭、框架 MyBatis/Spirng 事务管理器自动回收连接。

2. 连接池耗尽(连接打满)

表现:获取连接超时,全链路阻塞。 诱因:

  1. max 连接数配置过小,并发量大;
  2. 慢 SQL 长时间占用连接不释放;
  3. 连接泄露;
  4. DB 服务端宕机 / 网络闪断,大量连接僵死。

六、主流连接池对比(Java)

  1. HikariCP(SpringBoot 默认):轻量、零锁优化、性能最高,参数精简;
  2. Druid(阿里):内置监控面板、防 SQL 注入、扩展强,企业项目常用;
  3. C3P0/DBCP:老牌连接池,性能落后,新项目基本淘汰。

七、不止数据库:Redis / 消息队列也有连接池

  1. Redis 连接池(Lettuce/Jedis):TCP 连接复用,Jedis 老版本必须依赖连接池,Lettuce 基于 Netty 多路复用,少量连接支撑大量并发;
  2. RocketMQ/Kafka 生产者连接池:复用 Broker 网络连接,避免每次发消息新建 TCP。

池化通用思想:昂贵资源预先创建、循环复用、统一管控生命周期

八、补充:数据库服务端连接参数(MySQL 视角)

max_connections:MySQL 服务端最大允许接入连接总数,应用连接池 max 不能超过该值,否则会出现 DB 拒绝新连接。 例:MySQL 默认 150,应用所有服务连接池 max 总和不能 > 150。

http://www.gsyq.cn/news/1476078.html

相关文章:

  • LabelImg安装后打不开?别慌!5个常见报错排查与修复指南(Windows/Mac)
  • 实战演练:基于快马平台生成可交互的qclow官网全栈项目
  • 从课程作业到项目实战:如何用面向对象思想设计你的连杆机构仿真库(Python版)
  • 探索数据自主管理新维度:重构个人数字记忆的完整方案
  • 构建安全通信的基石:RSA-Library 加密库深度解析
  • 零成本解锁WeMod Pro:开源增强工具全面指南
  • 模板驱动型文档自动化:零代码实现动态填充与品牌合规
  • Java 分布式事务详解:4 大类主流方案(原理、执行流程、优缺点、使用场景、区别对比)
  • 经常寄快递怎么省钱 - 快递物流资讯
  • Inkscape光学设计插件:在矢量绘图中实现专业级光线追踪
  • 51单片机双机串口通信实战套件:带LCD实时状态显示、矩阵键盘交互、C#上位机监控与Proteus一键仿真
  • 3个技巧彻底解决Windows字体限制问题:No!! MeiryoUI零基础5分钟快速上手指南
  • Django搭建的流浪猫狗救助与领养全流程管理后台(含数据库和部署配置)
  • MIFARE Classic Tool终极指南:如何用Android手机轻松管理你的NFC门禁卡
  • LeetCode 337:打家劫舍 III(House Robber III)—— 题解 ✅
  • Python基础:字符串索引与切片操作完全指南
  • 昇腾CANN集群通信库hcomm:多机分布式训练的NCCL兼容通信方案
  • 【限时可复刻】CSDN AI+内容裂变+线索评分三步法:让咨询量暴涨210%的招生闭环(附配置参数表)
  • VidDown:免费视频解析下载 + 开发工具箱
  • 从零构建51单片机最小系统:原理、设计与调试全攻略
  • 从兼职工程师到行业认知:电源设计、3C认证与MCU选型的实战教训
  • 冷门技术内容冷启动难?用CSDN AI做选题挖掘,3步锁定高转化低竞争蓝海选题,错过再等半年!
  • SysDVR技术深度解析:Switch游戏实时串流架构设计与应用实战
  • 纯亚克力浴缸专业公司
  • CANopen协议实战指南:从总线原理到工程调试全解析
  • 智能时代工程师如何应对技术迭代与信息茧房挑战
  • Allegro高速PCB设计:Xnet创建与差分对等长约束实战指南
  • 仪器厂选型干货|实测多款串口屏,这家产品凭品质和交期脱颖而出
  • 如何用Zotero-Better-Notes实现智能笔记管理:3步快速上手指南
  • 书匠策AI官网www.shujiangce.com:论文党的“深夜急救箱“,期刊论文功能全拆解!