Рассмотрите возможность включения устойчивости к временным ошибкам, добавив EnableRetryOnFailure () к вызову Use MySql. - PullRequest
0 голосов
/ 08 июля 2020

У меня есть приложение на основе F #, я использую EF-Core и MySQL (Pomelo.EntityFrameworkCore. MySql). У меня есть метод async, который обновляет данные в БД (MySql)

let updatePlayerAchievementsAsync (logger:ILogger) (ctx:ReportCacheDbContext) (id: int) = async {
  let! account = ctx.AccountCaches.FirstOrDefaultAsync(fun e -> e.AccountId = id) |> Async.AwaitTask
  if account <> null then
    account.State <- "Closed"
    do! ctx.SaveChangesAsync true |> Async.AwaitTask |> Async.Ignore
    logger.LogInformation("Account{0} updated", id)        
}

, когда этот метод доходит до 99-го элемента, возникают следующие ошибки:

|ERROR|System.InvalidOperationException:An exception has been raised that is likely due to a transient failure. Consider enabling transient error resiliency by adding 'EnableRetryOnFailure()' to the 'UseMySql' call. 
---> MySql.Data.MySqlClient.MySqlException (0x80004005): Connect Timeout expired. All pooled connections are in use.

I попытался выполнить рекомендацию по 1-й ошибке и попытался добавить EnableRetryOnFailure()

member this.ConfigureServices(services: IServiceCollection) =
    services.AddOptions() |> ignore
    services.AddCors() |> ignore
    
    services
        .AddDbContext<ApplicationDbContext>(
            fun (service:IServiceProvider) (dbContext:DbContextOptionsBuilder) ->
                dbContext.UseMySql(profile.DbConnectionToAdmin /*HERE*/)|> ignore)
    ...

И я не могу найти никакой документации об этих параметрах добавления для F # & MySQL, потому что вся найденная информация написана на C# . Возможно, проблема в используемых пулах (по умолчанию max = 100), и я написал следующее:

...
do! ctx.SaveChangesAsync true |> Async.AwaitTask |> Async.Ignore
ctx.Database.CloseConnection()
logger.LogInformation("Account{0} updated", id)  

Но в любом случае проблема не была решена. Это мой новый опыт работы с F# и async, и я не могу понять, что я сделал неправильно. Может ли кто-нибудь помочь мне в такой проблеме? Большое спасибо!

...