Использование протокола связи с общей памятью SQL Server - PullRequest
5 голосов
/ 15 апреля 2011

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

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

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

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

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

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

1 Ответ

4 голосов
/ 15 апреля 2011

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

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

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

...