簡體   English   中英

連接字符串DNS查找是否被緩存?

[英]Do connection string DNS lookups get cached?

假設以下內容:

我在database.mywebsite.com上建立了一個數據庫,該數據庫解析為IP 111.111.1.1 ,從我們網絡上的本地DNS服務器運行。

我有無數的ASP,ASP.NET和WinForms應用程序,這些應用程序使用以database.mywebsite.com作為服務器名稱的連接字符串,它們都從內部網絡運行。

然后運行數據庫的盒子消失了,我切換到IP為222.222.2.2的新盒子。

因此,我將database.mywebsite.com的DNS更新為指向222.222.2.2

所有運行它們的應用程序和計算機是否都將緩存舊的已解析IP地址?

我假設他們會的。

are not too welcome as I cannot control this aspect of the situation, unfortunately. 不太歡迎都不要建議,因為我無法控制這種情況。 我們目前使用的是機器的機器名稱,該名稱每次消失時都會更改,並且所有應用程序等都必須使用新的機器名稱進行更新。 這很痛。

即使DNS不在計算機本地緩存,它也可能至少在短時間內緩存在計算機和名稱服務器之間DNS鏈上的某個位置。 我的理解是,這種情況通常將通過IP接管來解決,您只需將新機器制造為111.111.1.1。

可能是服務器故障的問題。

我猜您正在尋找DNS TTL(生存時間)。在我看來,應用程序最多可以為TTL值緩存IP。 但是,我擔心某些應用程序/技術實際上可能會緩存更長的時間(我認為Agian完全錯誤)

每台機器將緩存IP地址。

它被緩存的時間長度是TTL(生存時間)。 這是DNS服務器上的一項設置,如果將其設置得很低(例如5分鍾),那么您將很快啟動並運行。 有點破解,但應該可以。

是的,其他注釋是正確的,因為控制這是為主機名database.mywebsite.com設置的DNS TTL。

切換到輔助地址后,如果主地址(111.111.1.1)發生故障,您必須決定願意等待的最長時間。 較低的設置將為您提供更快的恢復時間,但同時也會增加DNS服務器的負載和帶寬,因為客戶端將不得不重新查詢它以更頻繁地刷新其緩存。

您可以使用cmd提示符中的-d選項使用nslookup,以查看查詢的DNS服務器的默認TTL時間和剩余TTL時間。

%> nslookup -d google.com

您應假定它們被兌現的原因有兩個,之前沒有明確提及:

1- OS系列的許多“現代”版本都進行DNS緩存。 2-許多應用程序都進行DNS緩存,或者在實時連接和/或打開新連接時檢測錯誤/失敗的能力很差。 這可能包括您的數據庫客戶端。

另外,這可能沒有很好的記錄。 我進行了一些谷歌搜索,並發現它適用於MySQL:

http://dev.mysql.com/doc/refman/5.0/en/connector-net-programming-connecting-connection-string.html#connector-net-programming-connecting-errors

它沒有明確解釋其在這方面的行為。

DNS被緩存,但是對於解析為錯誤IP地址的任何服務器,您可以更新服務器的HOSTS文件,並且IP應該立即更新。 如果訪問數據庫服務器的服務器數量有限,這可能是一個解決方案。

我在網站上遇到了類似的問題,該網站禁用了應用程序池回收功能,並連續運行了數周。 有時,群集的SQL Server框將重新啟動,並且由於某種原因,我的SqlConnection沒有重新連接。 我收到錯誤:

建立與SQL Server的連接時發生與網絡相關或特定於實例的錯誤。 服務器未找到或無法訪問。 驗證實例名稱正確,並且已將SQL Server配置為允許遠程連接。 (提供者:命名管道提供程序,錯誤:40-無法打開與SQL Server的連接)

服務器在那里-並且正在運行-實際上,如果我只是回收應用程序池,則該應用程序可以正常工作-但我不喜歡回收應用程序池!

連接池中保留的連接以某種方式使用了舊的連接信息,並且可能是舊的IP地址。 這似乎與發布者的問題非常相似,似乎是在緩存DNS信息,因為一旦清除了某種緩存,該應用程序就可以正常工作。

這就是我解決問題的方法-通過強制重新創建池中的所有連接:

Try
    ' Example: SqlDependency, but this could also be any SqlConnection.Open call
    Dim result As Boolean = SqlClient.SqlDependency.Start(ConnStr)
Catch sqlex As SqlClient.SqlException
    SqlClient.SqlConnection.ClearAllPools()
End Try

代碼示例只是精簡的基礎知識-應該針對您的情況進行調整!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM