ASP.NET SqlConnection Тайм-аут проблема - PullRequest
1 голос
/ 27 февраля 2010

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

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 () для чего-либо, поэтому я не могу явно закрыть объект.

Есть мысли? Спасибо!

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

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

Ответы [ 5 ]

0 голосов
/ 17 мая 2010

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

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

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 находятся на одном компьютере (реальное повышение производительности)!

0 голосов
/ 02 марта 2010

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

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

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

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

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

0 голосов
/ 27 февраля 2010

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

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

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

0 голосов
/ 27 февраля 2010

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

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

0 голосов
/ 27 февраля 2010

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

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

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