关键机制
- 按连接字符串分组
// 同一个 connStr 共享一个池
“Server=192.168.1.1;Database=mes;… Pooling=true;”
不同的连接字符串(比如不同 IP、不同数据库)各自独立一个池,互不干扰。
- Dispose 不是关闭
using var conn = CreateConnection(); // 从池取或新建
// … 执行 SQL …
// using 结束时调用 conn.Dispose()
// Dispose() 不关 TCP,而是把连接标记为"空闲"归还到池
// 下次 CreateConnection() 直接复用这个 TCP 连接,跳过三次握手
- 自动清理死连接
池中空闲连接如果因为网络断开、MySQL 重启、防火墙超时等原因已失效,下次被取出来时,MySQL 驱动会在 Open()
时发现并自动移除,然后静默创建新连接。应用层无感。
- 池大小控制
Pooling=true ← 启用
MinimumPoolSize=1 ← 启动时就建好 1 个连接,不会完全清空
MaximumPoolSize=10 ← 最多 10 个 TCP 连接
ConnectionIdleTimeout=300 ← 空闲超过 300 秒(5分钟)的连接才真正关闭,缩回 MinimumPoolSize
对应到代码里的流程
Form1 扫码
→ IsDatabaseConnected() —— 检查 isDbConnected 标志,不是真的连数据库
→ CreateConnection() —— 从池取连接(如果池里没有空闲且未满,建新 TCP)
→ SELECT —— 执行查询
→ using 结束 Dispose() —— 归还到池(TCP 不断开)
→ 下次扫码重复上面流程 —— 大概率复用同一个 TCP 连接
所以连接池的本质就是:TCP 连接复用 + 自动保活 + 透明重建。 应用层只需 new + Open + Dispose,底层是复用还是新建,完全不用关心。

992

被折叠的 条评论
为什么被折叠?



