Вот такая ситуация:
Есть компьютер под управлением Windows XP Embedded.
На нем стоит FireBird 1.5.3 - 4870
На компьютере работает программа, которая по расписанию запускает процесс опроса приборов учета.
Расписание находится в базе.
Данные с приборов вставляются в ту же базу.
Расписание пересчитывается из базы каждые 5 минут, или по событию БД.
Программы (для опроса приборов, и та, что следит за расписанием) написаны на BCB6 и Delphi 6, IBX последних версий.
Все запросы - и на вставку данных, и на чтение данных из БД, выполняются конструкциями вида:
TIBTransaction *tr=new TIBTransaction(this);
TIBSQL *qr=new TIBSQL(this);
tr->DefaultDatabase=SSDdb;
qr->Transaction=tr;
if(tr->InTransaction) tr->Commit(); tr->StartTransaction();
AnsiString qstring;
qstring= "update STIMETABLE set TYPECALL = :TYPECALL where typecall<>1";
qr->SQL->Add(qstring);
qr->GenerateParamNames=true;
if(tr->Active) tr->Commit(); tr->StartTransaction();
qr->GenerateParamNames=true;
qr->ParamByName("TYPECALL")->AsInteger=0;
qr->ExecQuery(); qr->Close(); tr->Commit(); delete qr; delete tr;
return 0;
Собственно, все это работает в течении некоторого времени. При попытке перезагрузки, комп повисает с некой ошибкой gds32.dll.
Поскольку все эти компы стоят без мониторов, и при зависе - их мануально перезагружают ресетом, то понять точно, какую ошибку дает gds32.dll не удается, к тому моменту как он зависает, RDP уже отключен.
Перезагрузка совершается программно по расписанию, вызовом bat файла, который контролирует корректное завершение основной программы, принудительно завершает все сеансы запросов данных, делает net stop "Firebird Server - DefaultInstance"
и вызывает перезагрузку. Но при перезагрузке - повисает.
Все это уже очень сильно напрягает.
Вопрос - как понять, из-за чего все валится ? эта перезагрузка очень нужна. Перезагружать по другому? Может ли это происходить из-за того, что каждый раз создается новая транзакция и новый запрос ? Но при запуске клиента для сбора данных там это все равно происходит. Куда копать ? Какие где логи смотреть ? Помогите плз.
Зависает комп при перезагрузке - ошибку выдает gds32.dll
Re: Зависает комп при перезагрузке - ошибку выдает gds32.dll
а они вообще где-то в коде уничтожаются?Может ли это происходить из-за того, что каждый раз создается новая транзакция и новый запрос ?
я бы посоветовал попытаться сымитировать ситуацию при наличии монитора, тогда станет видна "какая-то ошибка".При попытке перезагрузки, комп повисает с некой ошибкой gds32.dll.
Re: Зависает комп при перезагрузке - ошибку выдает gds32.dll
Ну да - см. код, предпоследняя строчка - delete qr; delete tr;kdv писал(а):а они вообще где-то в коде уничтожаются?
При падении gds32.dll что-то пишется в системные журналы Windows или в лог FireBird ?
Re: Зависает комп при перезагрузке - ошибку выдает gds32.dll
вообще gds32.dll обычно не падает. насчет что-то пишется - не уверен, надо смотреть, а не спрашивать.При падении gds32.dll что-то пишется в системные журналы Windows или в лог FireBird ?
Re: Зависает комп при перезагрузке - ошибку выдает gds32.dll
При вылете исключения delete qr; delete tr; не отработает.
Т.е. если исключения вылетают, то накапливается незакрытые запросы и транзакции, что может привести к довольно странному поведению.
Одно из быстрых и удобных решений это использовать std::auto_ptr:
Т.е. если исключения вылетают, то накапливается незакрытые запросы и транзакции, что может привести к довольно странному поведению.
Одно из быстрых и удобных решений это использовать std::auto_ptr:
Код: Выделить всё
std::auto_ptr<TIBTransaction> tr(new TIBTransaction(this));
std::auto_ptr<TIBSQL> qr(new TIBSQL(this));
...
qr->ExecQuery(); qr->Close(); tr->Commit();
return 0;
Re: Зависает комп при перезагрузке - ошибку выдает gds32.dll
Откуда это известно ? С event'ами работа есть ?Barsevich писал(а):При попытке перезагрузки, комп повисает с некой ошибкой gds32.dll