【问题标题】:SQL Server equivalent to Oracle error numbersSQL Server 等效于 Oracle 错误号
【发布时间】:2021-10-26 13:58:14
【问题描述】:

我正在将 .NET 应用程序从 Oracle 迁移到 SQL Server 数据库。该应用程序是在 2000 年代由第三方开发的,因此我们打算尽可能少地对其进行修改以避免引入新的错误。

我将 Oracle 引用替换为 SqlClient 引用(OracleConnectionSqlConnectionOracleTransactionSqlTransaction 等),一切正常。但是,在出现错误时尝试重新连接到数据库的逻辑有问题。

如果尝试读/写数据库时出现问题,则调用方法TryReconnect。该方法检查Oracle异常号是3114还是12571;如果是这样,它会尝试重新打开连接。

我检查了这些错误代码:

  • ORA-03114:未连接到 Oracle
  • ORA-12571:TNS:数据包写入器失败

我搜索了 SQL Server 的等效错误代码,但找不到它们。我检查了 MSSQL.NET SqlClient 文档,但我不确定其中任何一个是否等同于 ORA-3114 和 ORA-12571。

有人可以帮我决定在这个逻辑中应该检查哪些错误号吗?我考虑过检查代码 0(当我停止数据库以强制错误并测试它时,我看到它发生了)和 -2(超时已过期),但我不太确定。

【问题讨论】:

  • 行为不同。您不能将 SQL Server 重试逻辑基于 Oracle 语义。对于初学者,SqlConnection will retry to connect 甚至在旧的 System.Data.SqlClient 库中。它的替代品Microsoft.Data.SqlClient 包括configurable retry logic,用于处理与云数据库的连接。此重试逻辑在当前 RTM 版本 3.0.0 中默认开启
  • 您还可以查看高级弹性库,例如 Polly,它提供了几种使用策略的重试策略。 This article describes a SQL Server retry strategies package 处理几个瞬态故障。您可以直接使用它(Polly 非常受欢迎),或者您可以处理该文章中描述的瞬态错误编号

标签: sql-server oracle sqlclient


【解决方案1】:

行为不同。您不能将 SQL Server 重试逻辑基于 Oracle 语义。对于初学者,SqlConnection will retry to connect 即使在旧的 System.Data.SqlClient 库中也是如此。它的替代品Microsoft.Data.SqlClient 包括configurable retry logic,用于处理从本地应用程序到云数据库的连接,例如连接到Azure SQL 的本地应用程序。此重试逻辑在当前 RTM 版本 3.0.0 中默认开启。

您还可以查看高级弹性库,例如 Polly,这是一个非常流行的弹性包,它实现了恢复策略,如带退避的重试、断路器等。This article 描述了 Cadru.Polly,其中包含处理多个 SQL 的策略服务器瞬时故障。您可以直接使用它,也可以处理该文章中描述的瞬态错误编号:

Exception Handling Strategy Errors Handled
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

Polly 允许您组合策略并为它们指定不同的重试策略,例如:

  • 在某些情况下使用缓存响应(查找数据?)
  • 在其他情况下(死锁?)使用退避重试(甚至是随机延迟)。如果您遇到超时,随机延迟可能非常很有用,因为太多的并发操作会导致死锁或超时。没有它,所有失败的请求都会同时重试,导致再次失败
  • 使用断路器切换到不同的服务或服务器。

您可以创建一个 Oracle 策略,以便在整个项目中使用 Polly 并处理所有可恢复的故障,而不仅仅是数据库重试。

【讨论】:

    猜你喜欢
    • 2011-05-01
    • 2014-05-30
    • 1970-01-01
    • 2011-09-04
    • 2021-11-18
    • 2014-02-20
    • 2020-12-15
    • 2015-07-09
    • 1970-01-01
    相关资源
    最近更新 更多