Тема: Delphi / БД ADO
Показать сообщение отдельно
Старый 31.03.2014, 12:41   #1
Пользователь
 
Аватар для Fertis
 
Регистрация: 07.03.2009
Сообщений: 64
Сказал Спасибо: 33
Имеет 2 спасибок в 2 сообщенях
Fertis пока неопределено
По умолчанию Delphi / БД ADO

Использую компоненты TADOConnection, TADOStoredProc. Суть такая, что существует пул, в который каждые пол минуты добавляется штук 30 объектов, информацию о которых надо занести в БД. В потоке, в цикле вызывается хранимая процедура, которая соответственно по очереди заносит информацию в БД. Работает стабильно днями, если не нагружать базу, но если с БД происходят тяжелые операции, бэкап / очень долгие минутные запросы / etc, то поток который вносит инфу в базу виснет. Таймаут у хранимки стоит 5 секунд... как бы понятно что при нагрузке на БД срабатывает таймаут, но конструкция ниже его не отлавливает:

Код:
try
  try
    // ***
    FStoredProc.ExecProc;
  except
    on E: Exception do LogError('Запись в базу данных не выполнена');
  end;
finally
  FStoredProc.Close;
end;
Поток застревает и дальше не идет, эксепшен не срабатывает тоже.
Также отдельным потоком параллельно проверяю состояние компонента ADOConnection, оно всегда True (хотя бывало даже False, но куда реже). Таймаут у хранимки сделать большим не выход из ситуации. Вообщем как можно правильно отловить таймаут? )
Fertis вне форума   Ответить с цитированием