У меня есть приложение на основе 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
, и я не могу понять, что я сделал неправильно. Может ли кто-нибудь помочь мне в такой проблеме? Большое спасибо!