我们在 IIS 7.0、Windows Server 2008 R2 上运行 ASP.NET Web 应用程序,并使用 SQL Server 2008 R2 作为数据库。
在周末,当流量很高时,IIS 服务器中的请求队列长度大约每分钟就会增加一次(最多 800 个请求),然后下降。
我可以看到服务器正在处理一些请求,根据 IIS 管理器中的“当前请求”视图,这些请求正在长时间运行(其“已用时间”值范围为 20 到 50 秒)。
这些请求不一定是繁重的查询,实际上,我不明白为什么它们要花费这么长时间。
可能是因为客户端正在关闭其那边的连接吗?
谢谢,Shlomi
答案1
这似乎是连接池和打开过多连接的常见问题。在您的 DAL 上,您应该有类似以下内容(无论是 mssql 还是 mysql):
(我假设您正在使用 DataReader)
/// <summary>
/// Selects a single record from the Media table.
/// </summary>
public virtual Media Select(int mediaID)
{
SqlParameter[] parameters = new SqlParameter[]
{
new SqlParameter("@MediaID", mediaID)
};
using (SqlDataReader dataReader = SqlClientUtility.ExecuteReader(connectionStringName, CommandType.StoredProcedure, "MediaSelect", parameters))
{
if (dataReader.Read())
{
return MakeMedia(dataReader);
}
else
{
return null;
}
}
}
使用保证 SqlDataReader 将被正确处置。这只是一个基本示例,但通常你应该(可能)有一个用于所有 DAL 操作的通用类,该类提供连接助手并实现 IDisposable。我建议有一个所有 DAL 类都从其派生的基类。
如果 DAL 不是问题,我建议使用以下方法深入挖掘数据库SQL Server 事件探查器评估查询执行情况。
您还可以使用 SQL Server Monitor 检查平均执行时间和未关闭的连接。如果您的 DAL 有问题,您会看到很多待处理/等待的连接。