我們經常會討論到資料訪問超時的問題,當資料庫伺服器在遠端,而且該操作需要耗用較長的時間的時侯,程式經常性出現一些超時的問題。那麼應該從幾個層面來**這個問題呢
1. 首先,我們來了解一下sql server內部執行的時間(預設是無限期等待的,即無超時)
2.其次,我們要知道sqlconnection的connectiontimeout屬性,預設為15秒。這是獲取在嘗試建立連線時終止嘗試並生成錯誤之前所等待的時間
該值不能通過程式設計設定,而是直接在連線字串中指定
3.比較關鍵的是,我們要知道sqlcommand的commandtimeout屬性,預設為30秒。獲取或設定在終止執行命令的嘗試並生成錯誤之前的等待時間
值 0 指示無限制,在commandtimeout中應避免值 0,否則會無限期地等待執行命令
此屬性是在執行命令或處理結果期間所有網路讀取的累積超時。在返回第一行之後,超時仍然可能發生,但只包括網路讀取時間,而不包括使用者處理時間。
結合這三點,我做了乙個例子。下面的儲存過程是故意地阻塞2分鐘。
create proc getservertime(@result datetime output)
aswaitfor delay '00:02:00'
set @result=getdate()
下面是客戶端**
using system;
using system.data.sqlclient;
using system.data;
namespace test
conn.close(); }}
catch (sqlexception ex)
finally
console.read();}}
} 4.當該**放在中間層,我們這裡用web service為例,看看是否有什麼問題?
using system.componentmodel;
using system.data;
using system.web.services;
using system.data.sqlclient;
namespace webservice1
conn.close(); }}
catch (sqlexception ex)
finally
return result;}}
} 我們用客戶端呼叫該web server,但仍然會超時。同樣的**,為什麼會產生不一樣的結果呢?
還要注意的乙個地方是呼叫web service的客戶端**的超時設定。準確地說,大部分web service的**類都是繼承自webclientprotocol類的。這個類有乙個屬性:timeout
指示 xml web services 客戶端等待同步 xml web services 請求完成的時間(以毫秒計)。預設值為 100000 毫秒。(即100秒)
如果將 timeout 屬性設定為 timeout..::.infinite,則指示該請求無超時。即使 xml web services 客戶端可以將 timeout 屬性設定為無超時,web 伺服器仍可以在伺服器端使請求超時
asp.net的程式預設的執行超時時間為110秒,這是通過web.config檔案中的乙個屬性設定的。就是下面這個executiontimeout.單位為秒,預設為110.以前是90.
注意,該屬性只有當debug=false才生效
訪問redis集群提示連線超時的問題
上週在伺服器通過docker部署了乙個單機版redis集群,今天通過stackexchange.redis訪問的時候報了這個錯 提示我把超時時間設定一下,我去伺服器上找到redis的配置檔案,發現不是在那個裡面配置的,而是在程式裡的連線字串中進行設定 改完以後果然就好了。值得一提的是最開始是這樣設定...
訪問TOP鏈結超時和重置問題
前一陣子配合乙個isv一直在查訪問top服務鏈結被重置的問題,當時認為是sdk的問題,因此我就將sdk的資料鏈路層 單獨剝離出來給isv測試,沒有發現鏈結重置的問題。在加上部分業務 以後,有出現服務重置,但是概率很低。今天isv同學給我發來了修改後的 重置情況降低 這種修改還是有道理的,因此後續配合...
訪問TOP鏈結超時和重置問題
前一陣子配合乙個isv一直在查訪問top服務鏈結被重置的問題,當時認為是sdk的問題,因此我就將sdk的資料鏈路層 單獨剝離出來給isv測試,沒有發現鏈結重置的問題。在加上部分業務 以後,有出現服務重置,但是概率很低。今天isv同學給我發來了修改後的 重置情況降低 這種修改還是有道理的,因此後續配合...