You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 APIDnsFlushResolverCache在程序启动时刷新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:15:35