无法执行DbCommand,因为.net核心超时

时间:2020-01-30 10:50:42

标签: c# sql-server azure .net-core entity-framework-core

我的目标是提供简单的API,以从包含5列的Payments(约400行)表中检索数据。

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

用户可以使用请求参数为(应返回〜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,238ms) [Parameters = [@@ request_ClientClubType_0 ='?' (大小= 1)(DbType = 字节),@__ request_ProductType_1 ='?' (大小= 1)(DbType =字节)], CommandType ='文本',CommandTimeout = '60']

选择[p]。[Id], [p]。[ClientClubType],[p]。[PaymentsNumber],[p]。[ProductType], [p]。[Rate] from [Payments] AS [p] WHERE(([[p]。[ClientClubType] = @__ request_ClientClubType_0)和@__ request_ClientClubType_0 NULL)AND(([[p]。[ProductType] = @__ request_ProductType_1) @__ request_ProductType_1不为空)

我的应用程序是部署在azure linux web应用程序上的.net core 3.0应用程序。

该问题仅在生产中并非每次都发生,并且我无法从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();
}

0 个答案:

没有答案