2013-02-22 6 views
6

У нас есть трехуровневое приложение с клиентом C#, уровнем веб-сервиса C# WCF и базой данных SQL Server. Веб-служба подключается к базе данных с помощью ADO.NET. Весь наш C# -код использует .NET Framework 2.0.Мониторинг времени подключения к ADO.NET

Недавно клиент выполнил стресс-тест на нашем приложении. Во время теста веб-сервер генерировал много ошибок, таких как:

Не удалось подключиться к базе данных для строки подключения «...». Время ожидания истекло. Период ожидания истекает до завершения операции или сервер не отвечает.

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

Мы пытаемся выяснить, почему веб-сервер отключил подключение к базе данных. Я установил веб-сервер для включения всех ADO.NET performance counters. Однако я не вижу ничего, связанного со временем, необходимым для подключения или тайм-аутов подключения или тому подобного. В идеале мы могли бы графически отображать время соединения в perfmon рядом с другими счетчиками ADO.NET.

Есть ли способ отслеживать производительность ADO.NET при приобретении соединений?

Я предполагаю, что мы могли бы создать собственное счетчик производительности «среднее время соединения», создавая временные попытки открыть соединения, но я бы предпочел использовать то, что уже существует.

+0

Помог ли SQL Profiler в этом отношении? –

+0

@MrMoose: Профилировщик очень помог найти некоторые проблемные запросы. Но мне нужно что-то конкретное, чтобы контролировать время подключения, чтобы увидеть, когда они поднимутся, и когда они начнут отсчет времени. –

ответ

2

Вы можете использовать perfmon для получения этой информации. Вам необходимо будет подключиться к монитору User Connections под номером SQL Server: General Statistics. Here is the blog post Я схватил это от. Это даст вам знать, в какой момент времени соединения остаются открытыми.

Затем вам необходимо будет сопоставить это с задачами приложения (т. Е. Что вы делаете в приложении, когда видите, что они постоянно поднимаются).

После того, как вы сделали, что вы будете хотеть, чтобы получить эти соединения внутри using заявление, если вы еще не:

using (SqlConnection cn = new SqlConnection("some connection string")) 
{ 
    cn.Open(); 
    ... 
} 

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

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

+0

Спасибо, но я не беспокоюсь о подключении к приложениям. Я уверен, что наш объект данных делает это правильно. Мне интересно, почему иногда требуется много времени для подключения к базе данных. В частности, я хотел бы отслеживать время получения соединения через perfmon, чтобы я мог сопоставлять всплески в времени получения соединения с некоторыми номерами баз данных, такими как ожидающие ввода-вывода или использования ЦП или тому подобное. Я не вижу другого способа сделать это, кроме как создать свой собственный счетчик. –

 Смежные вопросы

  • Нет связанных вопросов^_^