我最近将.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,对象providerInfo,bool redirectedUserInstance,SqlConnectionString userConnectionOptions,SessionData reconnectSessionData,bool applyTransientFaultHandling) 在DbConnectionInternal System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions选项,DbConnectionPoolKey poolKey,对象poolGroupProviderInfo,DbConnectionPool池,DbConnection owningConnection,DbConnectionOptions userOptions) 在DbConnectionInternal System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool池,DbConnection owningObject,DbConnectionOptions选项,DbConnectionPoolKey poolKey,DbConnectionOptions userOptions) 在DbConnectionInternal System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject,DbConnectionOptions userOptions,DbConnectionInternal oldConnection) 无效System.Data.ProviderBase.DbConnectionPool.PoolCreateRequest(对象状态) 在bool System.Threading.ThreadPoolWorkQueue.Dispatch() ClientConnectionId:3873debc-b302-44f5-820a-8f760b1634e3 错误号:40613,状态:1,类:14
这不是新代码,在.NET Framework上运行时,行为并未停止。
答案 0 :(得分:0)
原因是System.Data.SqlClient
之前的版本4.5.0
软件包中都有错误。
https://github.com/dotnet/corefx/issues/14615#issuecomment-389248862
答案 1 :(得分:0)
如果您的客户端程序通过使用.NET Framework类System.Data.SqlClient.SqlConnection
连接到SQL数据库,请使用.NET 4.6.1或更高版本(或.NET Core),以便可以使用其连接重试< / strong>功能。有关此功能的更多信息,请参见此网页。
为SqlConnection对象构建连接字符串时,请在以下参数之间协调值:
ConnectRetryCount:默认为1。范围是0到255。
ConnectRetryInterval:默认为1秒。范围是1到60。
连接超时:默认为15秒。范围是0到2147483647。
具体来说,您选择的值应使以下等式成立:
连接超时= ConnectRetryCount * ConnectionRetryInterval
例如,如果计数等于3,并且间隔等于10秒,则仅29秒的超时不会给系统足够的时间进行第三次也是最后一次尝试连接:29 <3 * 10。
或安装Polly.Net:
安装包Polly
有关在其GitHub上找到的内容的更多信息:https://github.com/App-vNext/Polly