gpt4 book ai didi

c# - 由于超时已到.net core,执行 DbCommand 失败

转载 作者:行者123 更新时间:2023-12-02 22:50:31 26 4
gpt4 key购买 nike

我的目标是提供简单的 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. 日志2:执行超时已过期。操作完成之前超时时间已过,或者服务器没有响应。

Log1是(虽然这里不需要写log2):

Failed executing DbCommand (65,238ms) [Parameters=[@__request_ClientClubType_0='?' (Size = 1) (DbType = Byte), @__request_ProductType_1='?' (Size = 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) AND @__request_ClientClubType_0 IS NOT NULL) AND (([p].[ProductType] = @__request_ProductType_1) AND @__request_ProductType_1 IS NOT NULL)

我的应用程序是部署在 azure linux webapp 上的 .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();
}

最佳答案

  • 您的超时时间为 60 秒,可以增加。这样做通常不是一个好主意,因为它会隐藏其他问题。
  • 如果表有大量写入,或者某些事务运行时间较长,它可能会阻塞/与您的查询竞争。
  • 如果您的查询是 SQL 操作的较大开始事务 - 结束事务序列的一部分,则它可能会被其他打开的事务阻塞
  • 与上一个相同 - 如果同时/几乎同时对此查询进行多次调用,则可能会减慢每个查询的处理速度。我见过这样的情况:Web 前端填充了 20 行数据的屏幕,其中每一行都是对同一类型数据的同一 Web-API 端点的不同调用。例如,获取过去 12 个月每个月的每月交易金额总额。

关于c# - 由于超时已到.net core,执行 DbCommand 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59984280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com