Проблема связана с утечкой SQL-соединений.
Вы неправильно распределяете свои ресурсы.Со временем они будут складываться в пуле соединений, пока вы не достигнете точки, когда пул переполняется, и ваше приложение умирает.Сброс, очевидно, решит проблему.
Также эта проблема может не будет отображаться в «стрессовых» тестах в зависимости от того, как именно вы тестируете приложение.
Решение состоит в том, чтобы переформатировать этот код для обработкиваша база данных звонит лучше.
{
string url = string.empty;
using (SqlConnection dbconn = new SqlConnection(Application["dbconn"].ToString())) {
using (SqlCommand sqlValidate = dbconn.CreateCommand()) {
dbconn.Open();
sqlValidate.CommandText = "SELECT lastName, csn FROM Demographics WHERE lastName = '" + Session["lastName"].ToString() + "' " +
"AND dob = '" + Session["dobCheck"].ToString() + "' AND mrn = " + strMRN;
using (SqlDataReader results = sqlValidate.ExecuteReader()) {
if (results.HasRows) {
string csn = "";
while (results.Read())
{
if (!String.IsNullOrEmpty(results["csn"].ToString()))
{
csn = results["csn"].ToString();
break;
}
}
url = Application["surveyUrlString"] + "&lastname=" + Session["lastName"].ToString() + "&mrn=" + strMRN + "&dobday=" + Session["dobday"].ToString()
+ "&dobmonth=" + Session["dobmonth"].ToString() + "&dobyear=" + Session["dobyear"].ToString() + "&csn=" + csn;
}
} // sqldatareader
} // using sqlcommand
} // using sqlconnection
if (!String.IsNullOrEmpty(url)) {
Response.Redirect(url, false);
}
}
обратите внимание, что вы не перенаправляете до тех пор, пока все не будет очищено.
SqlConnection
, SqlCommand
и SqlDataReader
все орудия IDisposable
.Вы должны правильно убирать после использования, иначе ресурсы останутся зависшими.«Лучший» способ сделать это - заключить их в предложение using.Это гарантирует, что они удаляются должным образом после выхода из блока кода, поскольку они не собираются мусором, как другие объекты.
Также обратите внимание, что приведенный выше код имеет хорошие побочные преимущества.А именно, в случае ошибки он все равно уберется за вами.Принимая во внимание, что исходный код, который был опубликован, явно утечет в случае, если сервер БД не отвечает или выдает какой-либо тип ошибки при выполнении запроса.
Запрос может давать ошибку в зависимости от значений, содержащихся в dboCheck,параметры фамилия и мрн.Например, что, если для поля dobCheck было передано «BOB», или для mrn ничего не передано ... Если dob - это поле даты и времени в вашей базе данных, тогда запрос выдаст ошибку, которая приведет к утечке соединения.Сделайте это достаточное количество раз, и ваш сайт не работает.
После дальнейшего рассмотрения, я предполагаю, что это, вероятно, то, что происходит: люди помещают в мусор данные, которые ваше приложение позволяет достичь этой точки, и запростерпит неудачу.Скорее всего, это не то, что вы обрабатывали в своих тестовых примерах.
Примечание: Пожалуйста, не создавайте свои операторы sql с помощью конкатенации.Это полная безопасность, нет, нет.Как минимум, параметризовать эти запросы.