2011-04-15 31 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