【发布时间】:2021-10-26 13:58:14
【问题描述】:
我正在将 .NET 应用程序从 Oracle 迁移到 SQL Server 数据库。该应用程序是在 2000 年代由第三方开发的,因此我们打算尽可能少地对其进行修改以避免引入新的错误。
我将 Oracle 引用替换为 SqlClient 引用(OracleConnection 到 SqlConnection、OracleTransaction 到 SqlTransaction 等),一切正常。但是,在出现错误时尝试重新连接到数据库的逻辑有问题。
如果尝试读/写数据库时出现问题,则调用方法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