ado.net 默认启用连接池,但要求连接字符串完全一致(含大小写、空格、分号),否则视为不同池;close()/dispose() 仅归还连接至池,不立即断开网络;池大小、超时等参数直接影响错误类型与性能。
连接池不是自动开启的,得显式启用
ADO.NET 默认开启连接池,但前提是连接字符串完全一致——包括大小写、空格、额外分号。哪怕多一个 Pooling=true; 或少一个 Connection Timeout=30;,都会被视为不同池。常见错误是开发环境关了池(加了 Pooling=false;)测试完就忘了删,上线后扛不住并发。
实操建议:
- 用
SqlConnection.ConnectionString检查运行时实际值,别只看代码里写的 - 连接字符串中避免动态拼接用户名/密码;若必须,确保所有路径拼出的字符串字面量 100% 相同
- 不要在连接字符串里混用等价写法,比如
Initial Catalog=abc和Database=abc会触发两个池
连接对象 Dispose() 不等于断开网络,只是归还给池
调用 conn.Close() 或 conn.Dispose() 后,物理 TCP 连接大概率没关闭,而是被放回池中等待复用。真正销毁连接要等池管理器判断超时(默认 4–8 分钟无活动)或池满主动清理。
这意味着: