Windows-Server-2008

SQL Server 返回空結果集(忙?)

  • August 28, 2012

我從一開始就道歉,我沒有太多資訊可以繼續,我只是在尋找一些幫助來調試我的問題。

我有 5 個站點在裝有 SQL Server 2008 RC2 機器的 Windows Server Web Edition 2008 上執行。定期在所有網站上(不是同時)我會在我的 ASP.NET 2 網站上遇到一些錯誤,上面寫著Index was outside the bounds of the array.SQL 游標。這發生在數據肯定存在的地方,如果不是,我會得到更多的錯誤。就好像 SQL 伺服器由於某種原因無法返回結果一樣。

我不知道如何開始調試,我似乎沒有收到任何超時錯誤。我的問題是:

  1. 如何判斷 SQL 伺服器是否負載過大?我可以啟用一些允許我跟踪它的東西嗎?
  2. 如果我有日期和時間,是否可以檢查 SQL Server 上的一些日誌以顯示更多資訊?如果有,在哪裡?

對模糊的描述感到抱歉;目前我沒有太多事情要做。

編輯到目前為止的答案:

大多數時候,相同的程式碼可以順利執行。今天我設法通過創建一個無限循環並每次執行 SQL 查詢來複製這一點,然後我嘗試在同一個網站上傳入一個頁面,但它又帶來了這個錯誤。我的觀點是,當沒有可能的方式時,游標被返回為空。

Edit2 好的,也許我沒有正確解釋。我知道越界錯誤歸結為編碼。我要說的是,這是在 99.9% 的時間都有效的同一程式碼上隨機發生的。是的,程式碼引發了錯誤,但它首先不應該有一個空的結果集。這是完整的堆棧跟踪(同樣,這段程式碼在 99.9% 的時間內都有效):

(我使用的是 Delphi.NET,所以這就是 Borland 部分的來源) - 另請注意,當它在內部清除自己的列表時會發生錯誤……

Borland.Vcl.TDBBufferList.FreeHGlobal(IntPtr Ptr) at 
Borland.Vcl.TCustomADODataSet.FreeRecordBuffer(IntPtr& Buffer) at 
Borland.Vcl.TDataSet.SetBufListSize(Int32 Value) at 
Borland.Vcl.TDataSet.CloseCursor() at 
Borland.Vcl.TDataSet.SetActive(Boolean Value) at 
Borland.Vcl.TDataSet.Close() at 
WebCommon.TStockItemIntf.@13$Initialise$GetPLPrice(TStockItemIntf Self, String CCode, String SkCode, String PLStr) at 
WebCommon.TStockItemIntf.@23$Initialise$FinalPrice(TStockItemIntf Self, $Unnamed205& $frame_TStockItemIntf.Initialise, TKosCompany Company, TKosStock SkItem, TStockPriceCalcType PLCalcOption) at 
WebCommon.TStockItemIntf.Initialise(TKosStock SkItem, STOCK_ITEM SkCatItem, TAssignStockOptions AssignOptions, HttpSessionState Session, String DefaultPriceList) at 
WebCommon.TKosDropInProducerP.@68$AssignStockItem$AssignStockObjLst(TKosDropInProducerP Self, $Unnamed206& $frame_TKosDropInProducerP.AssignStockItem, TKosStock SkItem, String DefaultPriceList) at 
WebCommon.TKosDropInProducerP.AssignStockItem(TStringList StockCodeList, CATEGORY Category, HttpSessionState Session, TAssignStockOptions AssignOptions) at 
RecentlyViewedShortList.TRecentlyViewedShortList.Page_Load(Object sender, EventArgs e) at 
System.Web.UI.Control.OnLoad(EventArgs e) at 
System.Web.UI.Control.LoadRecursive() at 
System.Web.UI.Control.LoadRecursive() at 
System.Web.UI.Control.LoadRecursive() at 
System.Web.UI.Control.LoadRecursive() at 
System.Web.UI.Control.LoadRecursive() at 
System.Web.UI.Control.LoadRecursive() at 
System.Web.UI.Control.LoadRecursive() at 
System.Web.UI.Control.LoadRecursive() at 
System.Web.UI.Control.LoadRecursive() at 
System.Web.UI.Control.LoadRecursive() at 
System.Web.UI.Control.LoadRecursive() at 
System.Web.UI.Control.LoadRecursive() at 
System.Web.UI.Control.LoadRecursive() at 
System.Web.UI.Control.LoadRecursive() at 
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 

正如馬丁指出的那樣,這是一個 .Net 錯誤。

你應該檢查你的程式碼,它可以是任何東西,但我會舉一個例子說明這如何在虛擬碼中發生:

Item[] myItems = new Item[sql.queryshot("select count(*) form myTable")];
int counter=0;

Cursor MyCursor = GetData();
foreach(Data data in MyCursor){
 myItems[counter] = new Item(data);
 counter++;
}

如果有人在初始化數組Item之間插入了一條記錄

$$ $$和 GetData() 方法,您將看到 Index out of bounds 異常,因為您將傳遞數組的末尾。不過,這不會經常發生,因為兩次操作之間的時間非常短。 如果它是一個過載的伺服器,你肯定會得到其他錯誤,而不是這個。

此錯誤來自 .NET,與 SQL Server 完全無關。檢查您的程式碼以確保您的數組已正確定義。請記住,.NET 數組中也有一個 0 位置。如果你知道你有 10 個文章要從 sql server 讀取,並且你將數組調暗到長度 10,你必須使用 0 - 9 NOT 1 -10 因為 10 會給你上述錯誤。因此根本不是 sql server 問題。

如果您的 sql server 負載過大或遇到任何其他類型的問題,有很多方法可以跟踪,但這與您上面描述的問題無關。我推薦https://dba.stackexchange.com/來了解和閱讀更多相關資訊。

引用自:https://serverfault.com/questions/414588