gpt4 book ai didi

vb.net - RetryPolicy.Retrying 事件在 SQL Azure 的 transient 错误处理期间未触发?

转载 作者:行者123 更新时间:2023-12-03 03:16:49 29 4
gpt4 key购买 nike

我有一个托管在 azure(作为 Web 服务)中的网站,该网站使用 sql azure 作为后端。

我的错误日志中充斥着看似短暂的网络和 SQL 连接错误。

因此,我实现了企业库 transient 错误处理 block 。在测试中,它似乎运行正常。

我遇到的问题是我想记录发生此重试逻辑的实例。从文档中 RetryPolicy.Retrying 看起来是我正在处理的事件,但在测试中它不会触发。 C# 中有很多示例都遵循以下模式来触发此事件:

var retryPolicy = new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(retryStrategy);
// Receive notifications about retries.
retryPolicy.Retrying += (sender, args) =>
{
// Log details of the retry.
var msg = String.Format("Retry - Count:{0}, Delay:{1}, Exception:{2}",
args.CurrentRetryCount, args.Delay, args.LastException);
Trace.WriteLine(msg, "Information");
};

我以为我已经正确调整了这一点,但简而言之,下面的代码有什么问题?!

Private RetryManager As RetryManager
Private WithEvents RetryPolicy As RetryPolicy

Private Sub RetryPolicy_Retrying(ByVal sender As Object, ByVal args As RetryingEventArgs)
' Log details of the retry.
Dim msg = String.Format("Retry - Count:{0}, Delay:{1}, Exception:{2}", args.CurrentRetryCount, args.Delay, args.LastException)
Trace.TraceInformation(msg)
End Sub

Private Sub SetupRetryPolicy()
'If its already set then lets not do it again
If RetryPolicy Is Nothing Then
RetryManager = EnterpriseLibraryContainer.Current.GetInstance(Of RetryManager)()
RetryPolicy = RetryManager.GetRetryPolicy(Of SqlAzureTransientErrorDetectionStrategy)("Exponential Backoff Retry Strategy")
' connect sub as handler to event when retry occurs
AddHandler RetryPolicy.Retrying, AddressOf RetryPolicy_Retrying
End If
End Sub


Public Sub ExecuteAndDoStuff(ByVal connString As String, ByVal cmdText As String)

SetupRetryPolicy()

'get a connection with retry
Using conn As New ReliableSqlConnection(connString, RetryPolicy, RetryPolicy)
conn.Open()
Using cmd As SqlCommand = conn.CreateCommand
Try
cmd.CommandText = cmdText
' this might be overkill, do I need to pass the retry policy in again for the command?
Dim dr As SqlDataReader = cmd.ExecuteReaderWithRetry(RetryPolicy, RetryPolicy)
'... do something with this datareader

Catch ex As Exception
'log error
Trace.TraceError("Query failed to execute despite retry logic: " & ex.ToString)
'continue to throw the error (picked up higher up the chain)
Throw ex
End Try

End Using

End Using

End Sub

我对这段代码中至少一半的内容是完全陌生的,但在有人向我扔 rtfm 之前 - 我尝试过!

最佳答案

很难判断你的代码是否有问题;可能根本没有检测到 transient 错误。您如何确定存在暂时性错误?我要做的第一件事是确保您有一种可重复的方法来创建 transient 错误。

我设置测试的方法是在 Azure SQL 数据库中有一个 1GB 的数据库,用数据填充它直到达到其存储限制,然后尝试添加更多数据(这每次都会生成暂时性错误) )。

对于 Azure SQL transient 错误,需要记住两件事:

1)它们很难测试,因为它们中的许多依赖于您无法控制的变量;最容易复制的暂时性错误之一是空间不足(上面的建议)

2) 还有一些其他类型的错误可以被触发,例如 Azure 中的路由器切换条件,这些错误不被视为暂时性的;例如,SQL transient 策略不会捕获 IOException 错误。因此,您要么需要单独考虑这些类型的错误,要么自定义策略以包含这些错误。您的 catch block 应该在当前实现中捕获这些错误。

关于vb.net - RetryPolicy.Retrying 事件在 SQL Azure 的 transient 错误处理期间未触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24140714/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com