2013-09-26 110 views
0

我正在運行一個C#應用程序,它根據輸入重複查詢SQL Server 10.50.1617上的數據庫。 SQL查詢是應用程序中的嵌入資源。過去它運行良好。最近我們得到了更頻繁的SQL「超時過期」錯誤,現在它正處於程序從未完成的階段。我試着改變程序連接到數據庫的邏輯,以便查詢更小但更多。這沒有效果。連接到數據庫時發生SQL超時錯誤

此外,從調試我看到,超時隨機發生。例如,有時它甚至不能完成1個查詢(當在SSMS中直接完成時,其中的查詢少於1秒)。其他時間將在第900次查詢中超時。

我做了一些研究這個話題,發現其他人也有類似的問題(例如,這個帖子:SQL timeout expired on fast query

好像都提出了一些有益的建議,關於尋找交易的處置等。不過,我認爲我的主題背景要弱得多,比如將C#(我通過Visual Studio使用)和數據庫集成在一起。所以我找到了那些難以理解的問題的答案。更糟糕的是,我試圖在別人的代碼中解決這個問題,我原本沒有寫這個代碼。

我希望有人可以提供更多的外行人對我可能想要查看的一些事情的解釋,因爲我收到此錯誤。我對此很新,雖然我確實理解了大部分術語,但我仍然把頭部纏繞在所有運動部件上。

我可能想要查看或考慮重新編寫代碼的某些方面?這可能是我的C#代碼的一個問題,或者數據庫可能存在一些問題(由於此應用程序最初是編寫的,它已經大幅增長並繼續這樣做)?任何建議表示讚賞,請讓我知道我可以提供的任何其他信息。

protected IEnumerable<IDictionary<string, object>> ExecuteQuery(
      string query, 
      IDictionary<string, object> parameters, 
      IEqualityComparer<string> comparer = null) 
     { 

      using (DbCommand command = GetCommand()) 
      { 
       command.CommandText = query; 
       if (parameters != null) 
       { 
        foreach (var pair in parameters) 
        { 
         DbParameter parameter = command.CreateParameter(); 
         parameter.ParameterName = string.IsNullOrEmpty(ParameterPrefix) 
          ? pair.Key 
          : ParameterPrefix + pair.Key; 
         parameter.Value = pair.Value == null ? DBNull.Value : pair.Value; 
         command.Parameters.Add(parameter); 
        } 
       } 
       using (DbDataReader reader = command.ExecuteReader()) 
       { 
        while (reader.Read()) 
        { 
         var dict = comparer == null 
          ? new Dictionary<string, object>(reader.FieldCount) 
          : new Dictionary<string, object>(reader.FieldCount, comparer); 
         for (int i = 0; i < reader.FieldCount; ++i) 
         { 
          dict[reader.GetName(i)] = reader[i] == DBNull.Value ? null : reader[i]; 
         } 
         yield return dict; 
        } 
       } 
      } 
     } 

一般的代碼包含了很多不同的.cs的文件,所以我不知道什麼部分是最有成效的發佈,但這裏是被稱爲在其他地方,執行查詢的功能。我認爲這可能是最相關的開始。

數據庫命令被稱爲與「用」的語法應理論上處理處置問題,我以爲......

+2

您能否提供您正在使用的部分代碼?發生超時的原因有很多,有時會影響我們的是服務器正在接收大量連接和/或處於複雜任務的過程中。 – Nunners

+1

*** SQL ***只是**結構化查詢語言** - 一種語言,而不是數據庫產品。爲了幫助診斷連接問題,我們真的需要知道你正在使用哪個**具體數據庫系統**(以及哪個版本)(請相應地更新標籤)...... –

+0

我在猜測它是SQL Server作爲鏈接的問題是指SQL Server。 –

回答

0

使用查詢超時的,主要有兩種解決方案。

首先,您必須確保設置了超時,以便只有在出現問題時纔會觸發超時錯誤,並且錯誤地想要放棄查詢而不是稍等一下。例如,如果查詢通常需要5秒鐘,那麼您可能希望超時時間接近30秒。如果他們通常需要30秒,則可能需要2分鐘或更長時間的暫停。

其次,您必須確保查詢在儘可能短的時間內完成。

這不是一般性答案,但有很多關於如何使查詢運行更快的建議。如果這是一個相對較新的應用程序,則可能很少考慮適當的索引。然而,對於每個查詢,最佳方法可能不同。

+0

感謝您的輸入。我不確定查詢的結構本身是否是問題,因爲超時是非常隨機的。超時目前設置爲30秒,當我在SSMS中測試自己的查詢時,他們平均需要1-2秒,最多10秒。 – src

相關問題