Начальное соединение с SQL Server. Соединение медленное. Зачем? - PullRequest
12 голосов
/ 24 ноября 2010

Я столкнулся с ситуацией с приложением C #, установленным на двух сайтах, где первоначальное соединение с SQL Server очень медленное. Я написал тестовое приложение, чтобы проверить, где происходит замедление, и оно находится в первом операторе SQLConnection.Open. Установление соединения с сервером через именованные каналы заняло около 41 секунды. Мы подумали, что это может быть проблема DNS, но она так же медленна при использовании соединения TCP / IP. После того, как начальное соединение установлено, соединение объединяется, и приложение отвечает нормально. И рабочая станция, и сервер являются приличными компьютерами под управлением Windows 7 Pro, Core 2 Duo 3.16 ГГц с 4 гигабайтами Ram. Я нашел следующую статью на форуме Microsoft:

http://social.msdn.microsoft.com/Forums/en/windowscompatibility/thread/f295994c-5812-4e46-8ac9-f05471d4dd54

При отключении протокола LLMNR начальное время соединения сократилось примерно на половину до 21 секунды. Тем не менее, это все еще долго, чтобы получить первоначальное подключение к SQL Server. Единственное, что немного отличается от нашей нормы, это то, что DNS в этом случае выполняется через маршрутизатор, а не реальный сервер. Пока что это произошло только в двух местах, другие работают без проблем. Любая помощь будет оценена.

Спасибо, Dennis

Ответы [ 14 ]

0 голосов
/ 10 декабря 2010

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

На скорость влияет множество факторов: - Конфигурация TCP / IP - Маршрутизаторы на стороне сервера - и т. Д.

0 голосов
/ 07 декабря 2010

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

В качестве эксперимента попробуйте проверить связь с сервером из клиентского ящика - если для определения имени хоста требуется много времени, то вы нашли виновника: поиск имени хоста (DNS или NBNS). Другой альтернативой является использование IP-адреса хоста, а не имени. Так что если у вас есть SQL Server с именем экземпляра bob на сервере sql2005-01, а этот сервер имеет IP 192.168.200.12, попробуйте подключиться к 192.168.200.12\bob вместо sql2005-01\bob.

Аутентификация более неудобна для разрешения, но вы можете проверить ее с помощью runas на сервере SQL (например, runas /user:domain\user cmd, чтобы увидеть, можете ли вы открыть командную строку в качестве пользователя, которого вы пытаетесь аутентифицировать как .

0 голосов
/ 06 декабря 2010

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

Также вы пытались подключиться к SQL, используя те же учетные данные, что и ваше соединение?

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

Удачи.

0 голосов
/ 05 декабря 2010

Существуют и другие способы создания соединений с базами данных SQL.Попробуйте найти учебник, который использует

sqlconnection myCon = new sqlconnection(details);

myCon.Open()

вместо создания объекта для экземпляра соединения.

...