sql-server - SQL Server 等效于 Oracle 错误号
问题描述
我正在处理从 Oracle 到 SQL Server 数据库的 .NET 应用程序迁移。该应用程序是在 2000 年代由第三方开发的,因此我们打算尽可能少地对其进行修改以避免引入新的错误。
我将 Oracle 引用替换为 SqlClient 引用(OracleConnection
to SqlConnection
、OracleTransaction
toSqlTransaction
等),一切正常。但是,在出现错误时尝试重新连接到数据库的逻辑有问题。
如果在尝试读取/写入数据库时出现问题,则会TryReconnect
调用方法。该方法检查Oracle异常号是3114还是12571;如果是这样,它会尝试重新打开连接。
我检查了这些错误代码:
- ORA-03114: 未连接到 Oracle
- ORA-12571: TNS: 数据包写入器失败
我搜索了 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 |
网络连接异常处理策略 | 11001 |
Polly 允许您组合策略并为它们指定不同的重试策略,例如:
- 在某些情况下使用缓存响应(查找数据?)
- 在其他情况下重试(甚至是随机延迟)(死锁?)。如果您遇到超时,随机延迟可能非常有用,因为太多的并发操作会导致死锁或超时。没有它,所有失败的请求都会同时重试,导致另一个失败
- 使用断路器切换到不同的服务或服务器。
您可以创建一个 Oracle 策略,这样您就可以在整个项目中使用 Polly 并处理所有可恢复的故障,而不仅仅是数据库重试。
推荐阅读
- sql - 动态 Neo4j 密码查询
- r - 在 R 3.4.4 中卸载包 R6 2.2.0
- xml - shell 查找给定属性的 xml 标签
- node.js - Docker 内编译的打字稿中断:“不能在模块外使用导入语句”
- python - 在 Python/Selenium 中使用 find_element_by 语句绕过异常错误
- javascript - 如何在 Vue 3 中向嵌套的 vanilla DOM 元素添加响应式数据?
- c# - (局部变量)列表假期参数 1:无法从 'System.Collections.Generic.List 转换
' 至 '?' - tensorflow - 将 tensorflow 数据集记录分块为多条记录
- python - 使用列表理解和公式
- php - 如何在 php 代码中选择特定的文件名?