Vik*_*kas 3 sql-server ado.net sql-server-2012 connection-pooling
我们有一个实时的 ASP.Net 应用程序,它被大约 1000 个并发用户使用。在这个应用程序中,我们使用了连接池。在 web.config 中定义了 2 个不同名称的连接字符串,但我们正在调用相同的数据库。
<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'"/>
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,我们正在打开一个关闭连接的每个地方,如下所示
try{
if (connection.State == ConnectionState.Closed)
{
connection.Open();
}
}
catch(Exception ex)
{
}
finally{connection.close()}
Run Code Online (Sandbox Code Playgroud)
现在的问题是当我使用 sp_who2 检查数据库时,我看到大约 1000 或更多的睡眠会话,并且每个记录程序名称是“.Net sql server Provider”。我浏览了 MSDN,发现如果我们使用连接池,那么连接会保持打开状态直到 4-8 分钟。所以我现在有点困惑,如果我只使用 2 个连接字符串和连接池,那么为什么我们看到这么多休眠连接,我想它应该只有 2 个?有人可以在这种情况下帮助我并提出正确的建议吗?我们怎样才能最大限度地减少睡眠时间。也不确定是应用程序池(IIS 服务器)错误还是应用程序错误?请帮忙。
谢谢,
所以我现在有点困惑,如果我只使用 2 个连接字符串和连接池,那么为什么我们看到这么多休眠连接,我想它应该只有 2 个?
Min Pool Size=50指定在创建池时建立的连接数,并将保留在池中,直到卸载应用程序池(包括 IIS 重新启动)。使用 2 个不同的连接字符串和安全上下文,您将始终拥有至少 100 个连接,并且这些连接在不使用时将在 SQL Server 上显示为休眠状态。目的Min Pool是确保至少有一定数量的连接始终可供应用程序使用,并避免物理关闭和打开连接所需的开销,但成本如下所述。
该Max Pool Size=500规范允许每个池最多有 500 个连接,因此如果需要,您最多可以拥有 1000 个连接。Min Pool Size仅当池中没有未使用的连接可用时,才会获取超过 的连接。您看到的大量连接sp_who2可能是由于用户活动、长时间运行的查询,因为连接没有及时关闭/处理,或者池连接仍然与事务上下文相关联。
我们怎样才能最大限度地减少睡眠时间。也不确定是应用程序池(IIS 服务器)错误还是应用程序错误?请帮忙。
不确定您所说的 IIS 错误是什么意思,但不是由于查询活动而导致的大量休眠连接可能表明存在应用程序问题。ADO.NET 连接池文档中的所有示例都使用一个using块来确保正确关闭和处理连接,而无需应用代码显式关闭连接。我建议您在整个应用程序中使用连接和事务对象始终如一地遵循这种做法。
SQL 服务器上的休眠连接开销是额外的内存和客户端连接池管理。下面的查询将显示所有 SQL Server 连接消耗了多少内存:
SELECT SUM(cntr_value) AS ConnectionMemoryKB
FROM sys.dm_os_performance_counters
WHERE counter_name = N'Connection Memory (KB)';
Run Code Online (Sandbox Code Playgroud)