C# 在EF 6中首次调用数据库前延迟15秒

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)

在C#ASP.NET MVC with EF 6应用程序投入生产大约3个月后,我们注意到对数据库的一次调用比以前花费的时间要长得多。一开始,手术只花了不到一秒钟的时间。在没有逐渐增加的情况下,它跳到了15秒

我已启用EF上下文上的日志记录。这是代码

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