У нас есть веб-сайт, у которого есть проблемы с производительностью, когда выполнение хранимых процедур является узким местом. Одной из причин этого является то, что некоторые из этих хранимых процедур запускаются при загрузке страницы.
Итак, допустим, что нагрузка на БД высока, и пользователь разочарован тем, сколько времени занимает загрузка отчета на странице, и многократно обновляет страницу, начиная с новых выполнений той же хранимой процедуры.
Вот код, который мы используем для выполнения хранимой процедуры и управления соединением:
using (SqlCommand cmd = CreateCommand(qry, CommandType.StoredProcedure, args))
{
SqlDataAdapter adapt = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapt.Fill(ds);
return ds;
}
Старые исполнения все еще попадают в базу данных, даже когда пользователь покидает страницу или обновляет ее, порождая новую.
Два возможных решения:
- Каким-то образом завершить выполнение хранимой процедуры, когда пользователь, который ее породил, покинет страницу, на которой она была бы показана.
- Сделайте еще один шаг и попытайтесь сохранить тот же экземпляр соединения, чтобы, если пользователь нажал на ту же страницу, он дождался результатов предыдущей хранимой процедуры и затем отобразил их на странице.
Каковы общие практики, как эти вещи, и как они применяются? Как я могу по крайней мере убить хранимую процедуру, когда пользователь покидает страницу, которая вызвала ее?