Как мне узнать, какой код потребляет мой пул соединений SQL Server? - PullRequest
0 голосов
/ 01 июля 2010

Я переписал ниже на основе ответов.

У меня есть веб-сайт, который вызывает проблемы ВЫСОКОГО ЦП на сервере базы данных до такой степени, что сервер становится недоступным. Переработка пула приложений устраняет проблему. По словам администратора сервера http://www.microsoft.com/downloads/details.aspx?FamilyID=28bd5941-c458-46f1-b24d-f60151d875a3&displaylang=en показывает, что существуют потоки, которые активны около часа.

Взаимодействия с базой данных очень просты и работали до того, как мы добавили в приложение маршрутизацию веб-форм.

Они состоят только из такого кода во всем приложении. Да, этот код не идеален, но не этот код является проблемой, так как до того, как мы добавили маршрутизацию, проблем не было.

  private string GetPublishedParagraphs()
  {
    string query, paragraphs = "";
    try
    {

      m_sql_connection = new SqlConnection(m_base_page.ConnectionString());
      query = "select * from PublishedParagraphs where IDDataContent_page='" + m_IDDataContent_page + "'";

      SqlDataAdapter da = new SqlDataAdapter(query, m_sql_connection);
      DataSet ds = new DataSet();
      da.Fill(ds, "paragraph");

      if (ds.Tables["paragraph"].Rows.Count > 0)
        paragraphs = (string)ds.Tables["paragraph"].Rows[0]["paragraphs"];

      ds.Dispose();
     da.Dispose();
   }
   finally
   {
     m_sql_connection.Close();
   }

   paragraphs = paragraphs.Replace("™", "™");

   return paragraphs;
}

Строка подключения выглядит следующим образом:

server_name; User ID=server_user; Password=server_password

Мы тщательно проверили, что за каждым вызовом базы данных Open () следует Close (). Мы измерили, что нет открытых соединений, просматривая их, поскольку мы запускаем приложение локально, и количество соединений не увеличивается с помощью:

SELECT SPID,
       STATUS,
       PROGRAM_NAME,
       LOGINAME=RTRIM(LOGINAME),
       HOSTNAME,
       CMD
FROM  MASTER.DBO.SYSPROCESSES
WHERE DB_NAME(DBID) = 'TEST' AND DBID != 0 

(Однако, если мы не закроем соединения, есть утечка)

Отличие нашего приложения от того, когда оно работало, заключается в добавлении маршрутизации asp.net через веб-формы. Это также вызывает базу данных, но снова закрывает соединения после того, как они открыты.

Мы не уверены, что еще мы можем проверить. Есть идеи, коллеги-программисты?

ОТВЕТ

Мы нашли проблему через Query Profiler. Это показало нам запрос с высоким уровнем использования. Возвращение запроса к коду показало бесконечный цикл, вызывающий базу данных снова и снова. Это было трудно найти, так как цикл был инициирован ботом, который вызывал страницу на сайте, которого больше не было.

Ответы [ 3 ]

1 голос
/ 01 июля 2010
  • В показанном вами коде ds и da .Dispose идут в блок finally.А еще лучше, используйте структуру using () {}, которая обеспечивает удаление объекта

  • шаблон построения собственной строки в качестве запроса - это не просто дыра в безопасности, это также оченьнеэффективен.Вместо этого используйте хранимую процедуру и параметр.

  • запрос для процессов является чрезмерно ограничительным.Если у вас есть проблема с ресурсом, которая приводит к отказу в соединениях, она не будет ограничена одной базой данных.Единственное, что я бы ограничил, это текущая команда -> где spid! = @@ spid

  • REALLY нужны сообщения об ошибках и контекст - где онибыть увиденным?Расскажите нам больше, и мы поможем!

Удачи!


  • Во-первых, отличная дополнительная информация!Спасибо за продолжение.

  • Я бы предположил, что если вы уверены, что опубликованный вами код не имеет отношения к проблеме, вы удалите его из вопроса.Тем не менее, проблема не в том, чтобы просто быть «несовершенной».Правильное удаление объектов, интенсивно использующих память - те, которые первоначальные разработчики признали достаточно интенсивными для включения метода dispose () - те, которые взаимодействуют с базой данных - в то время как у вас возникают необъяснимые проблемы с базой данных, - это, на мой взгляд, не маленькая проблема.

  • Я немного погуглил и нашел это .Хотя я не стал бы говорить, что это проблема, это заставило меня задуматься.Когда "потоки, которые активны около часа" , это измеряется на сервере БД или на веб-сервере?Я не знаком с этим инструментом, но можете ли вы публиковать журналы с помощью этого инструмента?

  • На веб-сервере вы можете отслеживать действия кода маршрутизации?Код маршрутизации написан / настроен таким образом, чтобы защитить от бесконечных циклов - см. Вопрос и ответы здесь текст .

  • В более ранней версии моегоответ, я сказал вам, что поиск только @ соединений для конкретной базы данных был слишком ограниченным для вашей задачи.Пояснения к вашему вопросу не указывают, что вы исправили этот запрос.Я бы предложил:


    SELECT 
        is_being_blocked = sp.blocked
        , sp.cpu
        , DB_NAME ( dbid )
        , sp.status
        , LOGINAME=RTRIM(sp.LOGINAME)
        , sp.HOSTNAME
        , sp.Hostprocess
        , sp.CMD
    FROM  SYSPROCESSES sp
    WHERE spid != @@SPID
    ORDER BY 
        sp.blocked ASC
        , sp.cpu DESC

  • Журналы - что говорят журналы SQL Server за промежуток времени за 10 минут до и 10 минут после перезапуска веб-приложения?

  • Вы пробовали и повторяется ли эта проблема в процессе разработки?

  • Скажите, пожалуйста, что означает приведенное ниже заявление с точки зрения вашей заявки -сообщение об ошибке или другое: «сервер становится недоступным»

  • Я настоятельно рекомендую запустить трассировку сервера sql с помощью профилировщика.Согласно тому, что вы говорите в этом вопросе, это то, что я бы проследил за сохранением в таблицу (на другом сервере sql) или сохранением в файл (на другом компьютере, а не на сервере sql).Этот след предназначен для поиска проблемы, которая серьезно затрудняет производство.Это не то, что вы хотели бы запускать на регулярной основе.

Я бы захватил эти события

* Errors and Warnings - all of them
* Security Audit 
** Audit Login
** Audit Logout
* Sessions
** Existing Sessions
* TSQL
** SQL: Stmt Starting
** SQL: Stmt Completed
** Prepare SQL
** Exec Prepared SQL

Я бы не использовал никаких фильтров, кроме предустановок.

1 голос
/ 01 июля 2010

Вы пытались запустить запрос sp_who2 в SQL Server Management Studio, чтобы увидеть, сколько активных соединений с базой данных существует, поскольку код выглядит нормально.

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

0 голосов
/ 01 июля 2010

что вы подразумеваете под "исчерпанием пула приложений?" Вы имеете в виду пул соединений?

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

...