首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ADO.NET,server的休眠状态正在增加吗?

使用ADO.NET,server的休眠状态正在增加吗?
EN

Database Administration用户
提问于 2019-08-24 11:43:33
回答 2查看 1.6K关注 0票数 3

我们有一个活动的ASP.Net应用程序,它被大约1000个并发用户使用。在这个应用程序中,我们使用了连接池。在web.config中定义了两个连接字符串,名称不同,但我们调用的是相同的DB。

代码语言:javascript
复制
<add key="connection1" value="server=1.1.1.1;USER ID=**;pwd=**;database=test;Max Pool Size=500;Min Pool Size=50;Connection Timeout = 300; Pooling='true'" />

<add key="connection2" value="server=1.1.1.1;USER ID=**;pwd=**;database=test;Max Pool Size=500;Min Pool Size=50;Connection Timeout = 300; Pooling='true'"/>

在我的应用程序中,我们打开一个关闭连接,如下所示

代码语言:javascript
复制
try{
    if (connection.State == ConnectionState.Closed)
        {
            connection.Open();
        }
}
catch(Exception ex)
{
}
finally{connection.close()}

现在的问题是,当我使用sp_who2检查数据库时,我看到的是大约1000个或更多的休眠会话,对于每个记录程序名称都是".Net server提供程序“。我浏览了MSDN,发现如果我们使用连接池,那么连接一直打开到4-8分钟。所以我现在有点困惑,如果我只使用两个连接字符串和连接池,那么为什么我们看到这么多休眠连接,我想应该只有两个?在这种情况下,有谁能帮我,并建议什么是正确的?我们怎么才能把睡眠时间减到最低。还不确定是应用程序池(IIS服务器)错误还是应用程序错误?请帮帮忙。

谢谢,

EN

回答 2

Database Administration用户

回答已采纳

发布于 2019-08-24 15:11:45

所以我现在有点困惑,如果我只使用两个连接字符串和连接池,那么为什么我们看到这么多休眠连接,我想应该只有两个?

Min Pool Size=50指定在创建池时建立的连接数量,并将一直保留在池中,直到卸载应用程序池(包括IIS重新启动)。使用两个不同的连接字符串和安全上下文,您将在任何时候都至少有100个连接,当不使用时,这些连接将显示为休眠在Server上。Min Pool的目的是确保应用程序始终可以使用连接的数量,并避免实际关闭和打开连接所需的开销,但费用如下。

Max Pool Size=500规范允许每个池最多500个连接,因此如果需要,可以拥有多达1000个总连接。只有在池中不可用的连接不可用时,才会获得超过Min Pool Size的连接。您在sp_who2中看到的大量连接可能是用户活动、长期运行的查询的结果,因为连接没有及时关闭/处理,或者池连接仍然与事务上下文相关联。

我们怎么才能把睡眠时间减到最低。还不确定是应用程序池(IIS服务器)错误还是应用程序错误?请帮帮忙。

不确定IIS错误是什么意思,但大量未由查询活动引起的休眠连接可能表明应用程序问题。ADO.NET连接池文档中的所有示例都使用一个using块来确保连接被正确关闭和处理,而不需要应用程序代码显式关闭连接。我建议您遵循这种做法,在整个应用程序中始终使用连接和事务对象。

SQL服务器上的休眠连接开销是额外的内存和客户端连接池管理。下面的查询将显示所有Server连接占用多少内存:

代码语言:javascript
复制
SELECT SUM(cntr_value) AS ConnectionMemoryKB
FROM sys.dm_os_performance_counters
WHERE counter_name = N'Connection Memory (KB)';

The ADO.NET连接池文档

票数 6
EN

Database Administration用户

发布于 2019-08-25 10:08:11

发布这个答案是因为我不确定您是否已经排除了其他应用程序可能会使用相同的凭据打开连接到同一个db。

了解更多信息的一个简单方法是将Application Name添加到连接字符串中。

一些更详细的这里

只需将Application Name=Conn1;添加到第一个字符串,将Application Name=Conn2;添加到第二个字符串,就可以快速地将每个sql连接链接到相关字符串,然后从那里移动收集其他信息。

对我来说,在一个繁忙的intranet服务器上,错误选择的结果是,许多应用程序使用相同的凭证,使得几乎不可能在没有审计的情况下将每个会话绑定到应用程序上,而这个简单的技巧使sysadmin的生活变得更加简单,只需付出最少的努力和风险。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/246165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档