我最近将.NET Framework 4.6.1应用程序迁移到.NET Core 2.1,当SQL AZure数据库不可用时,该进程崩溃 . 该过程在Windows即服务上运行 .
问题本身不是例外(它是expected condition of SQL Azure),但事实是我无法处理异常,因为它没有直接出现在我的代码中 . 似乎异常发生在SQL连接池中 .
我通过监听 AppDomain.CurrentDomain.UnhandledException
事件收集了下面的堆栈跟踪:
System.Data.SqlClient.SqlException(0x80131904):服务器'XXXXXX'上的数据库'XXXXXX'当前不可用 . 请稍后重试连接 . 如果问题仍然存在,请联系客户支持,并为其提供会话跟踪ID“XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX” . 在新的System.Data.SqlClient.SqlInternalConnectionTds(DbConnectionPoolIdentity标识,SqlConnectionString connectionOptions,object providerInfo,bool redirectedUserInstance,SqlConnectionString userConnectionOptions,SessionData reconnectSessionData,bool applyTransientFaultHandling)在DbConnectionInternal System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions选项,DbConnectionPoolKey poolKey,对象)在DbConnectionInternal System.Data.ProviderBase.DbConnectionPool.CreateObject的DbConnectionInternal System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool池,DbConnection owningObject,DbConnectionOptions选项,DbConnectionPoolKey poolKey,DbConnectionOptions userOptions)中的poolGroupProviderInfo,DbConnectionPool池,DbConnection owningConnection,DbConnectionOptions userOptions) void System.Data.ProviderBase.DbConnectio中的DbConnection owningObject,DbConnectionOptions userOptions,DbConnectionInternal oldConnection) bool上的nPool.PoolCreateRequest(对象状态)System.Threading.ThreadPoolWorkQueue.Dispatch()ClientConnectionId:3873debc-b302-44f5-820a-8f760b1634e3错误号码:40613,状态:1,类:14
这不是一个新代码,并且在.NET Framework上运行时行为似乎有所不同,在.NET Framework上进程没有停止 .
2 回答
原因是
System.Data.SqlClient
包中有一个错误,直到4.5.0
https://github.com/dotnet/corefx/issues/14615#issuecomment-389248862
如果客户端程序使用.NET Framework类
System.Data.SqlClient.SqlConnection
连接到SQL数据库,请使用.NET 4.6.1或更高版本(或.NET Core),以便可以使用其 connection retry 功能 . 有关该功能的更多信息,请参阅此网页 .为SqlConnection对象构建连接字符串时,请协调以下参数之间的值:
具体而言,您选择的值应使以下相等为真:
连接超时= ConnectRetryCount * ConnectionRetryInterval
例如,如果计数等于3且间隔等于10秒,则仅29秒的超时不会给系统足够的时间进行第三次和最后一次重试连接:29 <3 * 10 .
更多信息:https://docs.microsoft.com/en-us/azure/sql-database/sql-database-connectivity-issues#net-sqlconnection-parameters-for-connection-retry
或者安装Polly.Net:
更多关于他们的GitHub上发现的:https://github.com/App-vNext/Polly