我有一些代碼查詢後端SQL服務器:設置連接超時是否會終止服務器端的查詢?
using (SqlConnection con = new SqlConnection(connString))
{
SqlDataReader dr;
SqlCommand cmd;
cmd = new SqlCommand("PROC1", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 300;
try
{
con.Open();
dr = cmd.ExecuteReader();
while(dr.Read())
{
// ...
}
}
catch (SqlException e)
{
// Some logging
}
catch (Exception e)
{
// Some logging
}
}
一旦發生超時,我期待的連接將被關閉和優秀的查詢將被殺死。我面臨的問題是tempdb
尺寸不變或不斷增加。因爲有許多其他進程訪問同一臺服務器,所以我想確保我不會因此而導致這種情況。
當發生查詢超時時,我是否可以期待SQL Server清理並正確殺死服務器端的未完成查詢,還是應該從我身邊做更多事情?
首先,tempdb大小將保持不變,除非您打開自動縮小,這通常不是一種好的做法。我會花更多的時間來尋找調查哪些進程影響tempdb的時間。存儲過程的實際內容是什麼?你確定它使用tempdb?其次,超時不會立即終止交易。它必須達到可以回滾的點。進程可能超出超時甚至掛起。這與在Management Studio中停止查詢確實沒有什麼不同,它需要一段時間才能實際停止。 –
標題問題的答案是「不」。在你的應用程序中可能有些東西可以做,但我不確定那會是什麼。 –
@ChrisH:我正在使用臨時表來存儲發起到遠程鏈接服務器的查詢的結果。有時服務器需要很長時間,因此我設置了超時時間。在並行執行環境中(我有20-30個線程調用查詢),這個場景如何處理? – Legend