我需要满足以下要求:
当数据库不可用时,我必须将所有查询写入缓冲文件(例如
.PMQ
)以供稍后执行。
缓存数据库结果对我来说是常识,但当数据库没有响应时,我第一次尝试将“要执行的查询”存储到单独的文件中。
所以我想问是否有任何通用的设计模式或准备实施这种情况的解决方案,如何正确处理这种情况,以及如何将其与例如集成。实体框架 8?
您可以尝试使用Polly重试机制。
当你的数据库不可用时,很可能你会得到
Microsoft.Data.SqlClient.SqlException
,所以你只需要定义重试策略,以指定的延迟重试此类异常:
var retryOptions = new RetryStrategyOptions
{
// Here you specify what exception you want to handle.
ShouldHandle = new PredicateBuilder().Handle<Microsoft.Data.SqlClient.SqlException>(),
// How many retries you want
MaxRetryAttempts = 3,
// What the delay should be - this can be greatly customized with other options
Delay = TimeSpan.FromSeconds(3),
// Do something, when retry will happen
OnRetry = async (args) => Console.WriteLine("RETRYING"),
};
使用这些选项,您可以定义重试应该以越来越长的间隔进行 - 有很多选项。
然后你可以像下面这样使用它:
var pipeline = new ResiliencePipelineBuilder()
.AddRetry(retryOptions)
//.AddTimeout(TimeSpan.FromSeconds(30)) // Add 10 seconds timeout
.Build(); // Builds the resilience pipeline
try
{
// Now wrap DB operation in retry pipeline.
var result = await pipeline.ExecuteAsync(
async ctx => await context.Movies.ToArrayAsync());
}
catch
{
}