2013-10-21 47 views
2

我們使用C++ SQLDriverConnect連接到我們的後端MS SQL Server。通過這些屬性,可以爲登錄超時設置一個參數(SQL_ATTR_LOGIN_TIMEOUT),該參數定義了在SQLDriverConnect(這是一種類型的登錄)需要花費多長時間。如何在出現網絡故障時控制SQLDriverConnect超時?

現在,如果我停止了服務器上的SQL服務,這個超時是受到尊重的,並且在調用函數後的X秒後我會得到我的連接錯誤,這當然是正確的。 但是,如果我不停止服務,但是,從服務器禁用網絡適配器,我們會拔出服務器的網絡電纜,SQLDriverConnect不會遵守此超時,並且只會在稍後返回。

例如,將超時設置爲5秒時,SQLDriverConnect僅在SQL Server關閉後53秒後纔會返回。

我知道這可以通過我自己的異步連接來解決,我可以在X秒後始終返回,但如果可能的話,我寧願不這樣做,只是使用提供的函數和選項來控制連接。

我認爲延遲是由試圖找到主機的網絡堆棧造成的,但是,我的想法是我們使用更高級別的API並超時,以確保我們不必擔心那些種類的東西...

關於如何「固定」的任何想法?提前

THX

維姆

回答

0

您是否嘗試過使用SQL_ATTR_CONNECT_TIMEOUT?

+1

嗨,我們嘗試了所有可能的連接屬性,但是,他們都沒有解決這個問題。我們發現這種行爲的原因實際上是在服務器的網絡上搜索「繁忙」的windows tcp/ip堆棧,並且它正在等待網絡超時。所以SQL連接不能改變/修改行爲,它最有可能位於套接字庫中。無論如何,我們通過進行異步處理來解決這個問題,這樣我們的主線程在我們設置的超時之後連續進行,而不管阻塞是在網絡,Sql還是其他任何組件上......它總能正常工作 –

+0

不錯。是的,我同意,異步I/O是要走的路。 – Aki

相關問題