我希望确保在执行context.SaveChanges()时重试,因为数据库可能暂时关闭。到目前为止,我所发现的包括编写大量代码,然后我需要维护,所以有什么现成的,开箱即用的工具,我可以使用的弹性?
context.SaveChanges()
eni9jsuy1#
我创建了一个名为ResilientSaveChanges.EFCore的小型库,它允许在Entity Framework Core中使用弹性context.SaveChanges/SaveChangesAsync,记录长时间运行的事务并限制并发的SaveChanges。在GitHub和NuGet上可用。在多个私有项目的生产中进行了尝试和测试。
ResilientSaveChanges.EFCore
context.SaveChanges
SaveChangesAsync
ckx4rj1h2#
是的,EF Core中有connection resiliency。对于MySQL,可以通过Pomelo驱动程序的EnabelRetryOnFailure()选项获得。Github Blame显示这是5年前添加的,这有点令人惊讶。3年前添加的重载允许指定额外的错误重试。以下代码摘自其中一个集成测试,显示了如何使用它:
EnabelRetryOnFailure()
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属性的异常)或超时异常。
EnableRetryOnFailure()
ICollection<int>
IsTransient
public static bool ShouldRetryOn([NotNull] Exception ex) => ex is MySqlException mySqlException ? mySqlException.IsTransient : ex is TimeoutException;
2条答案
按热度按时间eni9jsuy1#
我创建了一个名为
ResilientSaveChanges.EFCore
的小型库,它允许在Entity Framework Core中使用弹性context.SaveChanges
/SaveChangesAsync
,记录长时间运行的事务并限制并发的SaveChanges。在GitHub和NuGet上可用。在多个私有项目的生产中进行了尝试和测试。
ckx4rj1h2#
是的,EF Core中有connection resiliency。对于MySQL,可以通过Pomelo驱动程序的
EnabelRetryOnFailure()
选项获得。Github Blame显示这是5年前添加的,这有点令人惊讶。3年前添加的重载允许指定额外的错误重试。以下代码摘自其中一个集成测试,显示了如何使用它:
如果没有参数,
EnableRetryOnFailure()
将使用默认重试计数和最大延迟(分别为6秒和30秒)。第三个参数是要重试的其他错误的
ICollection<int>
。默认情况下,MySqlTransientExceptionDetector类指定仅重试瞬时异常(即设置了
IsTransient
属性的异常)或超时异常。