2010-02-27 4 views
1

У меня возникла разочаровывающая проблема, которую я изначально считал утечкой соединения, но это, похоже, не так. Secnario: доступ к данным для этого приложения использует корпоративные библиотеки (v4) от Microsoft. Все вызовы доступа к данным, завернутые в с помощью таких заявлений, какASP.NET SqlConnection Timeout issue

using (DbCommand dbCommand = db.GetStoredProcCommand("sproc")) 
{ 
    db.AddInParameter(dbCommand, "MaxReturn", DbType.Int32, MaxReturn); 
    ...more code 
} 

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

У меня есть аналогичный код с entlib на сайтах с высоким трафиком и НИКОГДА не возникало эта проблема.

Если я убью все подключения к базе данных и получить приложение производства обратно и работаю каждый раз я обновить приложение можно запустить этот SQL

SELECT DB_NAME(dbid) as 'Database Name', 
COUNT(dbid) as 'Total Connections' 
FROM sys.sysprocesses WITH (nolock) 
WHERE dbid > 0 
GROUP BY dbid 

Я могу видеть количество соединений активно растет с каждым Обновление страницы. Выполнение того же кода в моем локальном поле с той же строкой соединения не вызывает этой проблемы. Кроме того, если веб-сайт для производства не работает, я могу запустить сайт через Visual Studio и выполнить его отлично, и единственное различие между ними состоит в том, что на производственном сайте включена проверка подлинности Windows, а у моей локальной копии нет. Выключение аутентификации Windows не влияет на сервер.

У меня нет абсолютно никакой информации о том, что вызывает это, или почему соединения не удаляются в SQL Server. Объекты EntLib не обрабатывают методы .Close() для чего-либо, поэтому я не могу четко закрыть объект.

Любые мысли? Спасибо!

Редактировать

Wow я только заметил, что я никогда не отправил сообщение об ошибке. Oy. Фактическая ошибка подключения: Истекло время ожидания. Период ожидания истекает до получения соединения из пула. Возможно, это произошло из-за того, что все объединенные соединения использовались и максимальный размер пула был достигнут.

+0

Пожалуйста, поставьте некоторые из «более кода». –

+1

Учитывая, что индекс делает 8 вызовов хранимых procs/SELECT и т. Д., Сколько времени тратится в базе данных по каждому из этих запросов? Может быть, страница занимает довольно много времени, чтобы получить данные из БД и если запрашивается одна и та же страница, она приводит к новому соединению (или из пула) и выполнению длинных запросов? – shahkalpesh

+0

Дополнительный код не имеет особого значения, поскольку он либо выполняет считыватель внутри использования, либо выдает скаляр. Ванильный материал действительно. – dparsons

ответ

0

Убедитесь, что хранимая процедура, которую вы выполняете, не запущена в блокировку строки или таблицы. Также, если вы можете попытаться развернуть на другом сервере и проверить, будет ли приложение сканировать снова.

Также попытайтесь увеличить максимально допустимые соединения для вашего SQL-сервера.

0

думаю, что ошибка «Истекло время ожидания» является общей проблемой и может иметь определенные причины. Увеличение TimeOut может решить некоторые из них, но не все.

Вы также можете обратиться к следующим ссылкам для устранения неполадок и исправить ошибку

http://techielion.blogspot.com/2007/01/error-timeout-expired-timeout-period.html

0

Может быть проблема конфигурации на сервере?

Как вы подключаетесь к базе данных на производственном сервере?
Это может быть интересная область.

0

Хотя я не знаю ответа, я могу предположить, что по какой-то причине соединения не закрываются вами при запуске на производстве. (Указание очевидного)

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

Кроме того, это может помочь, глядя на счетчики производительности, перечисленных в конце следующей статье MSDN: http://msdn.microsoft.com/en-us/library/8xx3tyca%28VS.71%29.aspx

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

Глупый вопрос: правильно ли вы закрываете свой DataReader? Если нет, это может быть проблемой, и разница в поведении между dev и prod может быть вызвана различными шаблонами сбора мусора.

0

Я бы отключил объединение пулов и попытался его подавить (хех). Просто добавьте «; Pooling = false» в строку подключения.

Или, возможно, вы могли бы добавить что-то вроде следующего кода «очистки» на странице (которая закрывает любую связь оставил открытым, когда страница выгружается) - прямо в «использовании» пункта:

System.Web.UI.Page page = HttpContext.Current.Handler as System.Web.UI.Page; 
if (page != null) { 
      page.Unload += (EventHandler)delegate(object s, EventArgs e) { 
         try { 
           dbCommand.Connection.Close(); 
         } catch (Exception) { 
         } finally { 
           result = null; 
         } 
      }; 
} 

Также , убедитесь, что вы включили протоколл «общей памяти», если ваш SQL-сервер и IIS находятся на одной машине (настоящий усилитель производительности)!