2011-04-15 57 views
5

我通过互联网阅读了很多文章和类似主题的答案,但没有找到我的问题的原因。SQL Server共享内存通信协议使用情况

我有一个.NET 4 Windows服务连接到同一台机器上的SQL Server Express。在生产过程中只有一次发生以下错误:

“与服务器建立了连接,但在登录过程中发生错误(提供程序:命名管道提供程序,错误:0 - 否过程在管道的另一端。)“。

如果我们使用命名管道协议,因为我们没有在服务器上启用它们,导致出现此错误的原因很明显。但我的问题是为什么命名管道协议可以在这里使用?在连接字符串中,我们使用了“Data Source =。\ SQLEXPRESS”。考虑到msdn和互联网上的信息,我的理解是,当“。”始终使用必须使用“共享内存协议”。那么,为什么ADO.NET SqlClient决定使用命名管道协议呢?

大部分时间一切正常,但我需要知道这个过程,以便我们可以防止此类型的任何进一步的错误,如果需要的话。

由于提前, 托多尔

回答

4

你应该看看你的服务器上的sys.dm_exec_connections,看看什么是真正被客户端使用的网络传输。

正常情况下,客户端在本地服务器尝试SM,然后尝试NP,然后尝试TCP。试图连接到(local)遵循相同的规则,如果它不会然后工具和应用程序无法连接到本地服务器如果服务器不听 SM协议!事实上,您看到错误指示客户端尝试NP指向SM尝试失败时的情况,这可能是由于服务器繁忙或者服务器正在重新启动或类似情况。发生此问题时,系统事件日志和ERRORLOG可能包含更多信息。

您可以通过修改连接字符串来强制客户端使用特定协议,如How to use the server name parameter in a connection string to specify the client network library,使用servername=lpc:.\SQLEXPRESS来强制使用共享内存。

+0

首先感谢您的答案。我想知道的是,在什么情况下,Sql Client会引发异常。例如。当SM协议失败时,下一次尝试使用命名管道,我们有一个异常,因为它在服务器上被禁用,但是不是失败,因此尝试使用TCP?另外,如果我们有最大允许超时10秒,我们不会尝试每个协议10秒。一句话,哪个失败会导致下一个协议的尝试,并会导致立即异常? – 2011-04-18 08:23:26