C#(.NET Framework 4.8)高并发连接SQL Server HA组遇文件未找到错误求助
错误原因分析与解决建议
问题背景
基于.NET Framework 4.8的C#程序,用于连接SQL Server HA(可用性组),被WMS短时间内多次触发(30秒约10次),每次运行连接HA组、执行查询后退出。高并发场景下偶尔出现错误:
连接SQL Server时发生网络或实例特定错误
内部异常为:指定文件未找到
尝试报错时Thread.Sleep重连无效,数分钟后无需修改即可正常运行。错误堆栈如下:
à System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling, SqlAuthenticationProviderManager sqlAuthProviderManager) à System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) à System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) à System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) à System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) à System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) à System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) à System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) à System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) à System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) à System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry) à System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) à System.Data.SqlClient.SqlConnection.Open() à ExportTeliae.Program.Main(String[] args) dans C:\Users\<USERNAME>\Desktop\App\Program.cs:ligne 60
核心原因分析
1. SQL Server AG的DNS解析与客户端缓存冲突
短时间内多次启动独立进程,每个进程都会重新解析AG监听地址的DNS。如果AG发生故障转移、节点IP切换,客户端DNS缓存未及时更新,会导致进程连接到已失效的节点。失效节点可能已关闭SQL服务或释放相关资源,触发“指定文件未找到”的错误。
2. 进程级连接池与TCP资源耗尽
虽然每次进程运行后退出,但TCP连接会进入TIME_WAIT状态,短时间批量创建进程会快速耗尽客户端临时端口,或者打满SQL Server端的连接阈值。此外,旧进程残留的连接池元数据可能被复用,指向AG的失效节点,导致连接失败。
3. AG节点健康状态同步延迟
AG故障转移或节点同步过程中,监听地址可能提前对外提供服务,但节点内部的数据库资源(如系统文件、日志文件)尚未完全就绪。此时客户端发起连接会访问到未就绪的资源,触发文件未找到错误。短时间重试无法等待节点完成初始化,而数分钟后节点就绪则恢复正常。
4. 旧版SqlClient的AG兼容性缺陷
.NET Framework 4.8自带的System.Data.SqlClient版本可能存在AG支持缺陷,比如故障转移后的连接重试逻辑不完善,或TCP资源释放不及时,高并发下触发资源访问错误。
解决建议
1. 优化AG连接字符串参数
- 添加
MultiSubnetFailover=True:强制SqlClient同时尝试连接AG所有节点IP,无需依赖DNS解析的单一结果,避免DNS缓存过期问题(.NET Framework 4.5+支持)。 - 设置
Connection Reset=True:确保每次连接都重新验证服务器状态,避免复用失效的连接池条目。 - 调整
Max Pool Size:根据并发量设置合理值(如Max Pool Size=50),避免连接池过度扩张。
2. 处理DNS缓存与TCP资源
- 调用Windows API
DnsFlushResolverCache在程序启动时刷新DNS缓存,确保获取最新的AG节点IP。 - 修改客户端注册表调整TCP参数:将
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下的TcpTimedWaitDelay设为30秒,加快TIME_WAIT端口回收。
3. 检查AG集群状态
- 查看SQL Server AG的故障转移日志,确认报错时段是否存在节点切换、同步延迟或资源初始化超时。
- 调整AG的健康检查阈值,延长节点切换后的初始化等待时间,确保资源就绪后再对外提供服务。
4. 升级SqlClient组件
- 安装NuGet包
System.Data.SqlClient的最新稳定版,替代.NET Framework自带的旧版本,修复AG相关兼容问题。 - 迁移到
Microsoft.Data.SqlClient(官方推荐的新版SqlClient),对SQL Server AG的支持更完善,故障转移处理逻辑更健壮。
内容的提问来源于stack exchange,提问作者Cheh'Tan
相关产品推荐
相关产品推荐

