如何确定实体框架是不是正在等待来自连接池的连接?

Posted

技术标签:

【中文标题】如何确定实体框架是不是正在等待来自连接池的连接?【英文标题】:How to determine if the Entity Framework is waiting on a connection from the connection pool?如何确定实体框架是否正在等待来自连接池的连接? 【发布时间】:2013-07-23 17:00:09 【问题描述】:

我看到一些间歇性减速 \ sql 超时错误,我无法确定原因。我已经拼凑了一些线索,但我需要一些帮助来确定可能的后续步骤。

问题

我们有一个包含 10+ 百万条记录的表,我们从我们的 Web 应用程序运行异步计数。该表经常被写入。有时计数需要 2 分钟,有时它会超时,有时它会在一秒钟内从同一个生成的 sql 中返回。

我有一个理论,连接池中的所有连接都忙,所以它正在等待......但我不知道有什么方法可以证明它。

我们的设置

SQL 2012、Entity Framework 5.0 和 MVC Web API。

线索

在响应缓慢期间,我可以通过 sql 运行相同的 sql 管理工作室,它会在一秒钟内返回。 在响应缓慢期间网站的所有其他功能 表现不错,速度慢仅限于此区域。 问题仅出现在生产数据库上。我试图在没有任何运气的情况下在开发中重现它。

到目前为止我所做的尝试

我们遇到了计数锁定表和计时的问题 出去。因为表被锁了这么久导致 破坏我们的应用程序。我们将范围更改为“阅读 未提交”,这似乎已经解决了锁定问题,但没有 超时。

分析实体框架生成的查询

详情

查看 SQL Profiler 这里是运行的查询。

-- network protocol: LPC
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read uncommitted



 exec sp_executesql N'SELECT 
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT 
        COUNT(1) AS [A1]
        FROM [dbo].[CampaignSendResults] AS [Extent1]
        WHERE ([Extent1].[CampaignId] = @p__linq__0) AND (0 =  CAST( [Extent1].[ResultType] AS int))
    )  AS [GroupBy1]',N'@p__linq__0 uniqueidentifier',@p__linq__0='0BACD499-A665-4721-902A-37EAB49A8A8C'


exec sp_executesql N'SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    COUNT(1) AS [A1]
    FROM [dbo].[CampaignSendResults] AS [Extent1]
    WHERE ([Extent1].[CampaignId] = @p__linq__0) AND (0 =  CAST( [Extent1].[ResultType] AS int)) AND ( CAST( [Extent1].[SendDate] AS datetime2) >= @p__linq__1)
)  AS [GroupBy1]',N'@p__linq__0 uniqueidentifier,@p__linq__1 datetime2(7)',@p__linq__0='0BACD499-A665-4721-902A-37EAB49A8A8C',@p__linq__1='2013-07-23 00:35:12.6930000'

【问题讨论】:

你检查过连接池的性能计数器吗?这将在执行 EF 代码的机器上,不一定是数据库所在的位置。 我会先查看其中任何一个的查询计划,然后查看是否正在使用您的任何索引。 【参考方案1】:

问题可能是

set arithabort off

应该是

set arithabort on

【讨论】:

以上是关于如何确定实体框架是不是正在等待来自连接池的连接?的主要内容,如果未能解决你的问题,请参考以下文章

如何实现递归自连接实体框架?

如何调试/记录 Tomcat JDBC 连接池的连接?

技术经理:求求你,别再乱改数据库连接池的大小了!

实体框架中的连接泄漏

使用连接池后返回连接时如何检查连接是不是处于活动状态?

无法为实体框架6使用MySQL连接