一、为什么连接池不是"池化一个对象"这么简单
很多工程师把连接池当成一个"预先 new 好一批 Connection,用完放回去"的简单缓存。这种理解在低并发下不会出错,但一旦压测或大促,问题就会集中爆发:连接耗尽、线程阻塞、数据库被打爆、业务雪崩。要理解连接池,首先要理解它管理的"资源"到底贵在哪里。
一个 JDBC 物理连接的开销分三部分:
- 网络握手:TCP 三次握手 + TLS(如果开启 SSL)+ 数据库协议层的认证交换。内网单次通常 1~3ms,跨机房或云上可达几十毫秒。
- 服务端会话初始化:MySQL 会为每个连接分配独立线程、独立内存缓冲(
sort_buffer_size、join_buffer_size、read_buffer_size等),还要做权限校验和库表元数据加载。高并发下频繁创建连接等于频繁向服务端索要内存与线程。 - 连接状态与事务语义:连接是有状态的——当前数据库、事务隔离级别、
autocommit、会话变量、临时表、锁等。复用连接时必须"清洗"这些状态,否则就会产生脏数据或锁泄漏。
2024/5/4大约 14 分钟