短连接慢因每次新建需重复dns解析、tcp建连、tls握手、mysql协议握手、权限检查及会话初始化;长连接通过连接池化+智能回收(如hikaricp、maxlifetime、validationquery)复用物理连接,降低耗时至亚毫秒级。

短连接频繁创建和销毁会显著拖慢数据库性能,核心问题在于TCP三次握手、SSL协商(如启用)、认证授权、会话初始化等开销被重复执行。相比而言,长连接复用能跳过大部分初始化步骤,将单次查询的连接耗时从几十毫秒降至亚毫秒级。
短连接为什么慢?
每次新建连接都要经历:DNS解析(如有域名)、TCP建连、TLS握手(若加密)、MySQL协议握手(协议版本协商、挑战响应认证)、权限检查、会话变量初始化(如sql_mode、time_zone)。这些步骤在高并发下极易成为瓶颈,尤其当应用每秒发起数百次连接时,数据库可能卡在认证队列或系统级socket资源上。
长连接不是“一直不关”
真正有效的长连接策略是“连接池化”+“智能回收”:
在原版的基础上做了一下修正:增加1st在线支付功能与论坛用户数据结合,vip也可与论坛相关,增加互动性vip会员的全面修正评论没有提交正文的问题特价商品的调用连接问题删掉了2个木马文件去掉了一个后门补了SQL注入补了一个过滤漏洞浮动价不能删除的问题不能够搜索问题收藏时放入购物车时出错点放入购物车弹出2个窗口修正定单不能删除问题VIP出错问题主题添加问题商家注册页导航连接问题添加了导航FLASH源文
- 应用层维护固定大小连接池(如HikariCP默认10个),空闲连接保活但不永久占用
- 设置合理的maxLifetime(如30分钟),主动淘汰老化连接,避免服务端因wait_timeout断连导致异常
- 开启testOnBorrow或validationQuery(如SELECT 1),借出前轻量检测连接有效性
- 利用MySQL的wait_timeout和interactive_timeout配合,服务端自动清理空闲过久的连接
连接复用的关键细节
复用不等于“一个连接全队列串行使用”。需注意:
- 事务必须成对出现:BEGIN后必须COMMIT或ROLLBACK,否则连接会被标记为“忙”,无法归还池中
- 避免长事务持有连接:一个连接被事务占住期间,其他请求只能等待或触发池扩容(增加资源压力)
- 连接泄漏比性能更危险:未关闭的Statement/ResultSet、未归还的Connection,会逐步耗尽池容量,最终所有请求阻塞
- 区分逻辑连接与物理连接:ORM(如MyBatis)的SqlSession或JPA的EntityManager是逻辑句柄,其生命周期应严格绑定业务方法,而非整个HTTP请求
何时仍可用短连接?
极低频、非关键路径的场景可保留短连接,例如:
- 后台定时任务中每月执行一次的统计脚本
- 运维诊断类命令(如检查主从延迟),人工触发且无并发
- Serverless函数(如AWS Lambda),执行完即销毁,连接池无意义,此时应控制最大连接数并快速释放










