Использование протокола обмена общей памятью SQL Server

Я прочитал много статей и ответов на похожие темы в Интернете, но не нашел причины своей проблемы.

У меня есть служба Windows .NET 4, подключающаяся к SQL Server Express на том же компьютере. Только один раз в производстве случилась следующая ошибка:

«Соединение с сервером было успешно установлено, но затем во время входа в систему произошла ошибка. (поставщик: поставщик именованных каналов, ошибка: 0 - на другом конце канала нет процесса.)».

Причина этой ошибки очевидна, если мы используем протокол именованных каналов, потому что мы не включили их на сервере. Но у меня вопрос: почему здесь можно использовать протокол именованных каналов? В строке подключения мы использовали «Data Source =. \ SQLEXPRESS». Имея в виду информацию в msdn и в Интернете, я понимаю, что когда "." всегда используется "Протокол общей памяти". Так что же должно произойти, чтобы ADO.NET SqlClient решил вместо этого использовать протокол именованных каналов?

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

Заранее спасибо, Тодор


person Todor Petrov    schedule 15.04.2011    source источник


Ответы (1)


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

Обычно клиент пробует SM, если локальный сервер, затем пробует NP, а затем TCP. При попытке подключения к (local) следуйте тем же правилам, в противном случае инструменты и приложения не смогут подключиться к локальному серверу, если сервер не прослушивает протокол SM! Тот факт, что вы видите ошибки, указывающие, что клиент предпринял попытку NP, указывает на ситуации, когда попытка SM не удалась, что могло произойти из-за загруженного сервера, или если сервер перезагружался, или что-то подобное. Журнал системных событий и ERRORLOG могут содержать дополнительную информацию на момент возникновения этой проблемы.

Вы можете заставить клиента использовать определенный протокол, изменив строку подключения, как указано в Как использовать параметр имени сервера в строке подключения, чтобы указать клиентскую сетевую библиотеку, используйте servername=lpc:.\SQLEXPRESS для принудительного использования только общей памяти.

person Remus Rusanu    schedule 15.04.2011
comment
Сначала спасибо за ответ. Однако я пытаюсь понять, в каких сценариях клиент Sql выдает исключение. Например. когда протокол SM выходит из строя, следующая попытка выполняется с именованными каналами, и у нас есть исключение, потому что он отключен на сервере, но это не сбой, поэтому попробуйте использовать TCP? Также, если у нас есть максимально допустимый тайм-аут 10 секунд, мы не будем пробовать 10 секунд для каждого протокола. Одним словом, какие отказы вызовут попытку со следующим протоколом, а какие вызовут немедленное исключение? - person Todor Petrov; 18.04.2011