mysql EntityFrameworkCore中保存更改期间的恢复能力

dm7nw8vv  于 2023-01-12  发布在  Mysql
关注(0)|答案(2)|浏览(176)

我希望确保在执行context.SaveChanges()时重试,因为数据库可能暂时关闭。
到目前为止,我所发现的包括编写大量代码,然后我需要维护,所以有什么现成的,开箱即用的工具,我可以使用的弹性?

eni9jsuy

eni9jsuy1#

我创建了一个名为ResilientSaveChanges.EFCore的小型库,它允许在Entity Framework Core中使用弹性context.SaveChanges/SaveChangesAsync,记录长时间运行的事务并限制并发的SaveChanges。
GitHubNuGet上可用。在多个私有项目的生产中进行了尝试和测试。

ckx4rj1h

ckx4rj1h2#

是的,EF Core中有connection resiliency。对于MySQL,可以通过Pomelo驱动程序的EnabelRetryOnFailure()选项获得。Github Blame显示这是5年前添加的,这有点令人惊讶。3年前添加的重载允许指定额外的错误重试。
以下代码摘自其中一个集成测试,显示了如何使用它:

services.AddDbContextPool<AppDb>(
            options => options.UseMySql(
                GetConnectionString(),
                AppConfig.ServerVersion,
                mysqlOptions =>
                {
                    mysqlOptions.MaxBatchSize(AppConfig.EfBatchSize);
                    mysqlOptions.UseNewtonsoftJson();

                    if (AppConfig.EfRetryOnFailure > 0)
                    {
                        mysqlOptions.EnableRetryOnFailure(AppConfig.EfRetryOnFailure, TimeSpan.FromSeconds(5), null);
                    }
                }
        ));

如果没有参数,EnableRetryOnFailure()将使用默认重试计数和最大延迟(分别为6秒和30秒)。
第三个参数是要重试的其他错误的ICollection<int>
默认情况下,MySqlTransientExceptionDetector类指定仅重试瞬时异常(即设置了IsTransient属性的异常)或超时异常。

public static bool ShouldRetryOn([NotNull] Exception ex)
        => ex is MySqlException mySqlException
            ? mySqlException.IsTransient
            : ex is TimeoutException;

相关问题