Не удалось выполнить DbCommand из-за истечения времени ожидания. net core - PullRequest
7 голосов
/ 30 января 2020

Моя цель - предоставить простой API для извлечения данных из таблицы Payments (~ 400 строк), которая состоит из 5 столбцов.

Payment: Id (int),
PaymentsNumber (tinyint),
Rate (decimal(18,2)),
ProductType (tinyint),
ClientClubType (tinyint).

Пользователи могут отправлять запросы с помощью параметров запроса (must) возврат ~ 12 строк):

PaymentsRequest 
{
    public int? PaymentsNumber { get; set; }
    public byte? ProductType { get; set; }
    public byte? ClientClubType { get; set; }
}

Использование EF-Core:

services.AddDbContext<MyContext>(cfg => cfg.UseSqlServer(Configuration.GetConnectionString(...),optionsBuilder => optionsBuilder.CommandTimeout(60)));

public async Task<IEnumerable<Payments>> GetPaymentsAsync(PaymentsRequest request)
{
    IQueryable<Payments> query = this._context.Set<Payments>();
    query = query.Where(filter => 
                        (request.ClientClubType == null || filter.ClientClubType == request.ClientClubType) &&
                        (request.ProductType == null || filter.ProductType == request.ProductType) &&
                        (request.PaymentsNumber == null || filter.PaymentsNumber == request.PaymentsNumber));

    return await query.ToListAsync();
}

При azure сведения о приложении Я вижу 2 последовательных журнала, вызванных одним и тем же исключением:

  1. Log1: не удалось выполнить команду DbCommand.
  2. Log2: истекло время ожидания выполнения. Время ожидания истекло до завершения операции, или сервер не отвечает.

Log1 есть (хотя нет необходимости записывать здесь log2):

Не удалось выполнить команду DbCommand (65 238 мс) [Параметры = [@__ request_ClientClubType_0 = '?' (Размер = 1) (DbType = байт), @__ request_ProductType_1 = '?' (Размер = 1) (DbType = Byte)], CommandType = 'Text', CommandTimeout = '60 ']

SELECT [p]. [Id], [p]. [ClientClubType], [p] . [PaymentsNumber], [p]. [ProductType], [p]. [Rate] FROM [Payments] AS [p] WHERE (([p]. [ClientClubType] = @__ request_ClientClubType_0) И @__ request_ClientClubType_0 НЕ НУЖЕН) И (([стр. * webapp.

Проблема возникает только с производства, а не каждый раз, и я не могу восстановить проблему из MSSMS. Есть идеи?

ОБНОВЛЕНИЕ:

После того как @ panagiotis-kanavos прокомментировал, я обновил свой код до:

services.AddDbContextPool<MyContext>(cfg => cfg.UseSqlServer(Configuration.GetConnectionString(...),optionsBuilder => optionsBuilder.CommandTimeout(60)));

public async Task<IEnumerable<Payments>> GetPaymentsAsync(PaymentsRequest request)
{
    IQueryable<Payments> query = this._context.Payments;
    query = query.Where(filter => 
                        (filter.ClientClubType == request.ClientClubType) &&
                        (filter.ProductType == request.ProductType) &&
                        (filter.PaymentsNumber == request.PaymentsNumber));

    return await query.ToListAsync();
}
...