C# 在EF 6中首次调用数据库前延迟15秒
在C#ASP.NET MVC with EF 6应用程序投入生产大约3个月后,我们注意到对数据库的一次调用比以前花费的时间要长得多。一开始,手术只花了不到一秒钟的时间。在没有逐渐增加的情况下,它跳到了15秒 我已启用EF上下文上的日志记录。这是代码C# 在EF 6中首次调用数据库前延迟15秒,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,在C#ASP.NET MVC with EF 6应用程序投入生产大约3个月后,我们注意到对数据库的一次调用比以前花费的时间要长得多。一开始,手术只花了不到一秒钟的时间。在没有逐渐增加的情况下,它跳到了15秒 我已启用EF上下文上的日志记录。这是代码 public async Task<int> SetToProcessing(string[] documentIds, string userName) { if (documentIds.Count() == 0)
public async Task<int> SetToProcessing(string[] documentIds, string userName)
{
if (documentIds.Count() == 0)
return 0;
var assigned = 0;
using (var db = new InvoiceDeliveryContext())
{
db.Database.Log = message => logger.Debug("EF6-" + message);
foreach (var id in ConvertToLong(documentIds))
{
if (id == 0)
continue;
var doc = db.Documents.Find(id);
if (doc.Status == DocumentStates.Processing)
{
logger.Debug($"Document Id {id} not being set to processed. Already set to Processing.");
continue;
}
assigned++;
doc.AssignedTo = userName;
doc.Status = DocumentStates.Processing;
doc.History.Add(new History
{
Audit = "Set back to Processing.",
CreatedBy = userName,
Document = doc,
});
logger.Debug($"Assigned Document with ID={id} for Processing to {userName}.");
}
try
{
await db.SaveChangesAsync();
}
catch (Exception e)
{
logger.Error(e, "An exception occurred trying to set documents to processing.");
}
}
return assigned;
}
我多次捕获了上述过程的日志,它们都显示了大约15秒的延迟。其他查询没有遇到此问题。知道我为什么会看到这样的延误吗
编辑
我无法使用新的控制台应用程序重现延迟。private静态异步任务GoAsync()
{
var repo=new InvoiceRepository();
等待回购集合处理(新[]{“7149”},“JD蒙哥马利”);
}
日志记录。我不会将所有内容都记录到同一个数据库表中,但会将几个服务(包括UI层日志)记录到同一个数据库表中。对于调试级别,此问题正在发生。一旦我降低级别或停止登录数据库,问题就会消失
我猜日志表上有一个锁。日志记录。我不会将所有内容都记录到同一个数据库表中,但会将几个服务(包括UI层日志)记录到同一个数据库表中。对于调试级别,此问题正在发生。一旦我降低级别或停止登录数据库,问题就会消失
我猜日志表上有一个锁。这看起来像是一个简单的查询。进程中是否有任何部分持有该表的写锁?也许,您可能以15秒的间隔运行某个程序?这种情况是否仅在生产机器上发生?或者也在您的本地计算机上?@dasblinkenlight有一个Windows服务在白天非常活跃。它每20秒轮询一次数据库以查找工作。然而,由于我无法在MVC应用程序之外复制,Windows服务似乎不是问题所在。我将继续调查一个写锁。看起来确实很奇怪。起初我认为这可能是缺少索引,或者是参数/索引类型不匹配(因为我看到您的
@p0
是Int64
),但是在执行查询之前需要15秒的延迟。。。您需要查看一下SQL Server。请参阅SQLServerManagementStudio中的行为。查看数据库上的“自动关闭”选项是否处于启用状态。@s.m.生产代码和数据库,它出现在我的机器和生产上。这看起来像是一个简单的查询。进程中是否有任何部分持有该表的写锁?也许,您可能以15秒的间隔运行某个程序?这种情况是否仅在生产机器上发生?或者也在您的本地计算机上?@dasblinkenlight有一个Windows服务在白天非常活跃。它每20秒轮询一次数据库以查找工作。然而,由于我无法在MVC应用程序之外复制,Windows服务似乎不是问题所在。我将继续调查一个写锁。看起来确实很奇怪。起初我认为这可能是缺少索引,或者是参数/索引类型不匹配(因为我看到您的@p0
是Int64
),但是在执行查询之前需要15秒的延迟。。。您需要查看一下SQL Server。请参阅SQLServerManagementStudio中的行为。查看数据库上的“自动关闭”选项是否处于启用状态。@s.m.生产代码和数据库,它在我的机器上以及生产上都会出现。
[5] 2017-07-27 06:47:32.4742 EF6-Opened connection at 7/27/2017 6:47:32 AM -05:00
[5] 2017-07-27 06:47:47.0677 EF6-SELECT TOP (2)
[Extent1].[DocumentId] AS [DocumentId],
[Extent1].[AssignedTo] AS [AssignedTo],
[Extent1].[ApprovedBy] AS [ApprovedBy],
[Extent1].[AttachmentId] AS [AttachmentId],
[Extent1].[FileLocation] AS [FileLocation],
[Extent1].[FileSize] AS [FileSize],
[Extent1].[Name] AS [Name],
[Extent1].[Pages] AS [Pages],
[Extent1].[Part] AS [Part],
[Extent1].[Parts] AS [Parts],
[Extent1].[IsMerged] AS [IsMerged],
[Extent1].[ReceivedOn] AS [ReceivedOn],
[Extent1].[Status] AS [Status],
FROM [InvoiceDelivery].[Documents] AS [Extent1]
WHERE [Extent1].[DocumentId] = @p0
[5] 2017-07-27 06:47:47.0980 EF6--- p0: '7149' (Type = Int64)
[5] 2017-07-27 06:47:47.0980 EF6--- Executing at 7/27/2017 6:47:47 AM -05:00
[5] 2017-07-27 06:47:47.1401 EF6--- Completed in 28 ms with result: SqlDataReader