我们正在了解错误的 SQL 语句,并通过我们团队的 nlog 目标将其发送给团队以获取可见性。
但是 SQL 语句没有任何问题...所以想知道为什么它们有时会失败?
错误 - Microsoft.EntityFrameworkCore.Database.Command:执行 DbCommand 失败(18,978ms)
然后我们在 azure SQL 中查找锁等,但什么也没有?没有接近 30 秒的超时设置...有时我们会在日志中的时间范围很短的情况下收到其他查询的错误。
下面是我们的 nlog 规则:
{
"logger": "*",
"minLevel": "Error",
"maxLevel": "Fatal",
"writeTo": "teamsError",
"final": true
}
根本原因是什么?我们的 nlog 规则不应该是星号吗?
您处理这些随机的
DbCommand
超时,尽管您的 SQL 工作正常,但它们每隔几天就会出现一次。
可能会出现短暂的网络不稳定。尽管云通常可以很好地处理连接,但短暂的网络故障可能会导致超时。这些可能特别奇怪,因为它们不会持续发生并且很难在行动中捕捉到。
另一个因素可能是 Azure SQL 的内部资源管理。即使您没有达到 DTU 或 eDTU 等明显限制,临时资源争用仍然可能发生,导致查询偶尔失败。 Azure 可能会暂时限制资源,从而导致这些错误,尤其是在需求出现短暂激增的情况下。
您的日志记录设置是关键。现在,如果您仅捕获基本错误消息,则可能会错过可以解释问题的详细信息,例如确切的 SQL 错误代码或更具体的超时信息。捕获完整的异常堆栈(包括内部异常)至关重要。
您可能需要考虑在实体框架设置中使用
EnableRetryOnFailure
实现重试逻辑。这并不能解决根本原因,但它可以帮助减轻这些暂时性问题的影响,而无需引入更多的手动错误处理。