首页 文章

由于SQL连接池异常导致.NET Core进程崩溃

提问于
浏览
0

我最近将.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 回答

  • 0

    原因是 System.Data.SqlClient 包中有一个错误,直到 4.5.0

    https://github.com/dotnet/corefx/issues/14615#issuecomment-389248862

  • 0

    如果客户端程序使用.NET Framework类 System.Data.SqlClient.SqlConnection 连接到SQL数据库,请使用.NET 4.6.1或更高版本(或.NET Core),以便可以使用其 connection retry 功能 . 有关该功能的更多信息,请参阅此网页 .

    为SqlConnection对象构建连接字符串时,请协调以下参数之间的值:

    ConnectRetryCount:默认值为1.范围是0到255. ConnectRetryInterval:默认值为1秒 . 范围是1到60.连接超时:默认为15秒 . 范围是0到2147483647 .

    具体而言,您选择的值应使以下相等为真:

    连接超时= 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:

    安装包Polly

    更多关于他们的GitHub上发现的:https://github.com/App-vNext/Polly

相关问题