SQL Server ADO.NET不同主机同连接串是否共用连接池
结论
两台Web服务器会各自使用独立的连接池,完全不存在跨节点共用连接池的情况,你从sys.dm_exec_sessions查到的host_name字段差异,就是两个池独立工作的直接表现。
核心规则说明
- 首先搞清楚连接池的归属:SQL Server相关的连接池是客户端驱动实现的本地内存缓存,根本不是SQL Server服务端维护的共享资源。不管是.NET的SqlClient、Windows的ODBC驱动,还是Java的JDBC驱动,连接池都是跟着客户端应用进程走的,池里缓存的连接都是本机进程和数据库之间已经建立好的TCP长连接,存在当前进程的内存空间里。
- 你之前了解的「相同连接字符串归入同一连接池」的规则,生效边界就是单个客户端进程:只有在同一个应用进程内发起的连接请求,才会因为连接字符串完全一致被分配到同一个池里复用空闲连接。
- 你现在的部署架构里,两台Web服务器是完全独立的运行环境,跑在不同的主机上,两个API进程的内存空间完全隔离,没有任何驱动层面的共享内存通道能跨主机传递连接状态,就算两边的连接字符串一字不差,也只会各自在本地内存里初始化自己的连接池,各自受本地配置的
Max Pool Size参数约束,两边的池互不干扰。 - 站在SQL Server服务端的视角,它根本感知不到客户端有没有用连接池,只会看到来自两个不同主机的独立TCP连接请求,对应生成不同
host_name的会话记录,这和你观测到的现象完全吻合。
补充一个容易踩的坑:就算是同一台服务器上的两个不同应用进程,哪怕用了完全一样的连接字符串,也会生成两个独立的连接池,连接池从来不会跨进程、跨主机共享。
内容的提问来源于stack exchange,提问作者Raxit Chauhan
相关产品推荐
相关产品推荐

