PDA

Просмотр полной версии : Delphi / БД ADO


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


try
try
// ***
FStoredProc.ExecProc;
except
on E: Exception do LogError('Запись в базу данных не выполнена');
end;
finally
FStoredProc.Close;
end;


Поток застревает и дальше не идет, эксепшен не срабатывает тоже.
Также отдельным потоком параллельно проверяю состояние компонента ADOConnection, оно всегда True (хотя бывало даже False, но куда реже). Таймаут у хранимки сделать большим не выход из ситуации. Вообщем как можно правильно отловить таймаут? )

alexteam
01.04.2014, 13:14
свой TADOConnection для каждого отдельно взятого потока ?

Anfet
02.04.2014, 11:23
Или TCriticalSecton оборачиваешь каждый запрос.
Или отдельное соединение.

Можешь сделать отдельный датамодуль, создавать его для каждого потока и использовать вполне спокойно.

Fertis
02.04.2014, 22:28
Критические секции использую только при добавлении / извлечении из пула. Поток один, адоконнекшен тоже один, не многопоточно выполняю хранимку... как подсказал один человек, возможно фиговая синхронизация с основным потоком... хотя хз

alexteam
02.04.2014, 23:25
Поток один, адоконнекшен тоже один, не многопоточно выполняю хранимку...
"не многопоточно" 0_о это как ?

зы.
вангую что хранимая процедура вызывается в основном потоке приложения.
и есть дополнительный поток который переодически тоже обращается к бд.
в таком случае будут проблемы.

в моем посту выше есть "намек" на то как должно быть.

Fertis
03.04.2014, 10:27
не, народ видимо подумал что я вызываю хранимку из нескольких потоков, вот я и сказал что не многопоточно... в основном потоке процедура не вызывается, вызывается она как раз таки в дополнительном потоке. больше к бд никто не обращется.