Мы запускаем веб-приложение ASP.NET на IIS 7.0, Windows Server 2008 R2 с SQL Server 2008 R2 для БД.
По выходным, когда трафик высок, длина очереди запросов на серверах IIS увеличивается (до 800 запросов), а затем уменьшается каждую минуту или около того.
Я вижу, что серверы обрабатывают некоторые запросы, которые, согласно представлению «Текущие запросы» в диспетчере IIS, выполняются долго (их значение «Истекшее время» составляет от 20 до 50 секунд).
Эти запросы не обязательно являются сложными, на самом деле, я не могу понять, почему они занимают так много времени.
Может быть, потому что клиент закрывает соединение на своей стороне?
Спасибо, Шломи
Похоже, это обычная проблема с пулом соединений и со многими открытыми соединениями. На вашем 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 есть проблема, вы увидите много ожидающих / ожидающих соединений.