Веб-сайт ASP.NET порождает множество экземпляров Connections to SQL Server Express - как я могу определить виновный код? - PullRequest
3 голосов
/ 15 октября 2010

Это довольно большой, плохо закодированный веб-сайт ASP.NET, который мне сейчас поручено поддерживать.Одна проблема, которую я не знаю, как решить, заключается в том, что в кажущееся случайное время живой веб-сайт полностью блокируется, доступ к странице в порядке, но все, что касается базы данных, приводит к зависанию приложения на неопределенное время.

Причина, по-видимому, заключается в гораздо большем количестве открытых соединений с базой данных, чем можно было бы ожидать от веб-сайта с низким уровнем трафика.Монитор активности показывает более 150 открытых соединений, большинство из которых имеют значение Application «Поставщик данных .NET SqlClient» с логином сетевой службы.

Быстрое решение - перезапустить службу SQL Server (я перезапустилПул приложений ASP.NET также просто для того, чтобы приложение позволяло что-либо пропустить, и предотвращает повторную попытку любого кода открыть соединения, если был какой-то цикл, о котором я не знаю).Это, однако, не помогает мне решить проблему.

Приложение использует класс Microsoft SQLHelper, который является довольно распространенной библиотекой, поэтому я вполне уверен, что код, который использует этот класс, будет иметь закрытые соединения, гдетребуется.

Однако я заметил несколько DataReader, которые не закрыты должным образом.Я думаю, что я прав, говоря, что DataReader может сохранять базовое соединение открытым, даже если это соединение закрыто, потому что это подключенный класс (поправьте меня, если я ошибаюсь).

Что-то особенное эточто один из администраторов перезапустил сервер (не сервер базы данных, а реальный сервер) и сразу же, сайт снова зависнет.Виновником снова было 150+ открытых подключений к базе данных.

У кого-нибудь есть какие-либо диагностические методы, которыми они могут поделиться со мной, чтобы выяснить, где это происходит?

Обновление: В файлах журнала SQL Server показано много таких записей (30 +)

2010-10-15 13: 28: 53.15 spid54 Запуск базы данных 'test_db'.

Мне интересно, если серверполучает удар от атакующего.Это объясняет множество подключений сразу после загрузки и, казалось бы, в случайное время.

Обновление: Изменили свойство AutoClose, хотя все еще искали решение!

Обновление 2: Смотрите мой ответ на этот вопрос для решения!

Ответы [ 4 ]

4 голосов
/ 15 октября 2010

Обновление:

Много и много Starting up database: установите для свойства AutoClose значение false: REF


Вы правы насчет ваших DataReaders: убедитесь, что вы их закрыли.Тем не менее, у меня возникло много проблем с соединениями, которые выходят из-под контроля, даже когда соединения были закрыты должным образом.Пул соединений не работал должным образом, так как каждый постбэк создавал новый SqlConnection.Чтобы избежать этого, казалось бы, ненужного воссоздания соединения, был принят подход Singleton к моему DAL.Поэтому я создаю один DataAdapter и через него отправляю все свои запросы данных.Хотя мне сказали, что это неразумно, я не получил никакой поддержки для этого требования (и все еще хочу прочитать любую документацию / мнение на этот счет: я хочу поправиться, а не быть статус-кво).У меня есть класс DataAdapter, чтобы вы могли рассмотреть, хотите ли вы.

Если вы работаете в SQL 2005+, вы должны иметь возможность использовать Activity Monitor, чтобы увидеть «Сведения» о каждом соединении, которое иногда дает вам последнеезаявление выполнено.Возможно, это поможет вам отследить утверждение в каком-то месте кода.

3 голосов
/ 15 октября 2010

Я бы порекомендовал скачать http://sites.google.com/site/sqlprofiler/, чтобы увидеть, какие запросы происходят, и отчасти работать в обратном направлении.Удачи, мужик!

0 голосов
/ 04 января 2011

Эта проблема снова возникла сегодня, и мне удалось решить ее довольно легко, поэтому я решил опубликовать здесь.

В этом случае можно предположить, что спам в соединении исходит из одного и того же блока кода, поэтому, чтобы найти блок кода, я открыл монитор активности и проверил детали некоторых из множества открытых соединений (щелкните правой кнопкой мыши> детали). .

Это показало мне неправильный SQL, который вы можете найти в коде приложения / хранимых процедурах.

Как только я обнаружил это, это был, как я подозревал, незакрытый считыватель данных. Проблема теперь решена.

0 голосов
/ 15 октября 2010

Многие типы, такие как DbConnection, DbCommand и DbDataReader и их производные типы (SqlConnection, SqlCommand и SqlReader), реализуют интерфейс / шаблон IDisposable.

Без повторного объединения того, что уже было написано на предмете , вы можете воспользоваться этим механизмом черезоператор using.

Как правило, вы всегда должны пытаться обернуть объекты DbConnection, DbCommand и DbDataReader оператором using, который сгенерирует MSIL для вызова IDisposable Dispose.метод.Обычно в методе Dispose есть код для очистки неуправляемых ресурсов, таких как закрытие соединений с базой данных.

Например:

using(SqlConnection cn = new SqlConnection(connString))
{
  using(SqlCommand cmd = new SqlCommand("SELECT * FROM MyTable", cn))
  {
    cmd.CommandType = CommandType.Text;
    cn.Open();

    using(SqlDataReader rdr = cmd.ExecuteReader())
    {
      while(rdr.Read())
      { 
        ... do stuff etc 
      }
    }
  }
}

Это обеспечит вызов методов Disposeна все предметы, используемые сразу после использования.Например, Dispose методы SqlConnection сразу же закрывают соединение с базой данных, а не оставляют его для следующего запуска сборки мусора.

Небольшие изменения, подобные этому, улучшают способность ваших приложений масштабироваться под большой нагрузкой.,Как вы уже знаете, «Приобретайте дорогие ресурсы поздно и выпускайте рано».Выражение using - хороший пример синтаксического сахара.

Если вы используете VB.NET 2.0 или более позднюю версию, он имеет такую ​​же конструкцию:

Использование оператора (Visual Basic) (MSDN)
Использование оператора (C # Reference) (MSDN)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...