Назад | Перейти на главную страницу

SQL Server возвращает пустые наборы результатов (занят?)

Приношу свои извинения с самого начала, у меня не так много информации, и я просто ищу помощь в отладке моей проблемы.

У меня 5 сайтов, работающих на Windows Server Web Edition 2008 с машиной SQL Server 2008 RC2. Периодически на все сайты (не все одновременно), я получу несколько ошибок на моем веб-сайте (-ах) 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) 

Мне удалось найти причину этой проблемы (думаю).

Я могу определенно исключить загруженность SQL-сервера, потому что я запустил веб-сайт на отдельном экземпляре SQL-сервера, чтобы проверить, помогло ли это, но проблема все еще существовала.

В основном, когда я впервые написал код подключения к базе данных сайта, я подумал, что было бы лучше создать и использовать одно подключение к базе данных для каждой загрузки страницы. Это (как я теперь знаю) не рекомендуется из-за пула соединений SQL-сервера, который в любом случае будет обрабатывать соединения.

Когда я использую это соединение, я думаю, что TList, который содержал буфер записей, иногда менялся, и в этот момент он вызывал исключение вне диапазона, когда я пытался получить доступ к результату, который был там, но был удален / изменен.

В этой заметке я переписал свои соединения с базой данных и теперь использую собственные соединения .NET вместо дрянных адаптаций Delphi.

Как указал Мартин, это ошибка .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-сервера, и вы затемняете массив до длины 10, вы должны использовать 0-9, а НЕ 1-10, так как 10 даст вам указанную выше ошибку. Следовательно, это вообще не проблема с sql-сервером.

Есть много способов отследить, слишком ли загружен ваш sql-сервер или возникли какие-либо другие проблемы, но это не имеет отношения к проблеме, которую вы описали выше. Я рекомендую https://dba.stackexchange.com/ чтобы узнать и прочитать об этом больше.