我正在做一个。net应用程序从Oracle迁移到SQL Server数据库。该应用程序是在2000年由第三方开发的,因此我们打算尽可能少地修改它,以避免引入新的错误。
我替换了Oracle对SqlClient的引用(OracleConnection
到SqlConnection
,OracleTransaction
到SqlTransaction
等),一切都很好。然而,我有一个逻辑问题,试图在错误的情况下重新连接到DB。
如果在尝试读写数据库时出现问题,则调用TryReconnect
方法。这个方法检查Oracle异常号是3114还是12571;如果是,则尝试重新打开连接。
我检查了这些错误代码:
- ORA-03114: Not Connected to Oracle
- ORA-12571: TNS: packet writer failure
我搜索了SQL Server的等效错误代码,但我找不到它们。我检查了MSSQL和。net SqlClient文档,但我不确定其中任何一个是否等同于ORA-3114和ORA-12571。
有人能帮我决定在这个逻辑中应该检查哪些错误号码吗?我想检查代码0(我看到它发生时,我停止数据库强制一个错误和测试这个)和-2(超时过期),但我真的不确定它。
行为不同。你不能把SQL Server的重试逻辑建立在Oracle的语义上。对于初学者来说,即使在旧的System.Data.SqlClient库中,SqlConnection也会重试连接。它的替代品Microsoft.Data.SqlClient包含可配置的重试逻辑,以处理从本地应用程序到云数据库的连接,例如本地应用程序连接到Azure SQL。这个重试逻辑在当前RTM版本3.0.0中默认是开启的。
您还可以查看高级弹性库,如Polly,这是一个非常流行的弹性包,它实现了恢复策略,如带回退的重试,断路器等。本文介绍Cadru。Polly,包含处理几个SQL Server瞬态错误的策略。您可以直接使用它,也可以处理那篇文章中描述的临时错误编号:
异常处理策略 | 已处理错误 |
---|---|
SqlServerTransientExceptionHandlingStrategy | 40501、49920、49919、49918、41839、41325、41305、41302、41301、40613、40197、10936、10929、10928、10060、10054、10053、4221、4060、12015、233、121、64、20 |
SqlServerTransientTransactionExceptionHandlingStrategy | 40549年,40550年 |
SqlServerTimeoutExceptionHandlingStrategy | 2 |
NetworkConnectivityExceptionHandlingStrategy | 11001 |