【问题标题】:SQL Server Shared Memory communication protocol usageSQL Server 共享内存通信协议使用
【发布时间】:2011-04-15 17:11:58
【问题描述】:

我在互联网上阅读了很多类似主题的文章和答案,但没有找到问题的原因。

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

“与服务器成功建立连接,但在登录过程中发生错误。(提供者:命名管道提供者,错误:0 - 管道另一端没有进程。)” .

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

大多数时候一切都很好,但我需要知道这个过程,以便我们可以在需要时防止任何进一步的此类错误。

提前致谢, 托多尔

【问题讨论】:

    标签: .net sql-server ado.net communication-protocol


    【解决方案1】:

    您应该在您的服务器上查看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 强制仅共享内存。

    【讨论】:

    • 首先感谢您的回答。不过,我想了解的是 Sql Client 在什么情况下会引发异常。例如。当 SM 协议失败时,下一次尝试使用命名管道,我们有一个异常,因为它在服务器上被禁用,但不是失败,因此尝试使用 TCP?此外,如果我们有最大允许超时 10 秒,我们将不会为每个协议尝试 10 秒。总之,哪些失败会导致尝试下一个协议,哪些会导致立即异常?
    猜你喜欢
    • 1970-01-01
    • 2016-07-23
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多