У меня странная проблема со старым приложением Delphi, теряющим соединение с базой данных.На самом деле, я думаю, что теряется что-то еще, что затем делает соединение либо разрывается, либо становится непригоднымПриложение написано на Delphi 6 и использует компонент Direct Oracle Access (v4.0.7.1) для подключения к базе данных Oracle 9i.Приложение запускается как служба и периодически запрашивает базу данных, используя объект TOracleQuery (qryAlarmList).Метод, который вызывается для этого, выглядит следующим образом:
procedure TdmMain.RefreshAlarmList;
begin
try
qryAlarmList.Execute;
except
on E: Exception do
begin
FStatus := ssError;
EventLog.LogError(-1, 'TdmMain.RefreshAlarmList', 'Message: ' + E.Message);
end;
end;
end;
Он работал нормально в течение многих лет, пока на этом компьютере не было добавлено несколько сценариев Perl.Эти сценарии запускаются каждые 15 минут и ищут файлы данных для импорта в базу данных, а затем выполняют некоторые вычисления и выполняют операции чтения / записи в / из базы данных.По какой-то причине, когда они обрабатывают большие объемы данных, а затем приложение Delphi пытается выполнить запрос к базе данных, приложение Delphi создает исключение в строке «qryAlarmList.Execute» в приведенном выше листинге кода.Исключением всегда является:
Access violation at address 00000000. read of address 00000000
КАК что-то, что скрипты Perl делают, вызывает это ??На этом компьютере есть другие сценарии Perl, которые загружают данные с использованием тех же модулей и вызовов методов, и у нас не было проблем.Чтобы сделать это еще более странным, есть два других приложения, которые также внезапно утратят способность общаться с базой данных в то же время, когда работает Perl.Ни одно из этих приложений не работает на этом компьютере, но оба они являются приложениями Delphi 6, которые используют один и тот же компонент DOA для подключения к одной и той же базе данных.У нас есть другие приложения, которые подключаются к той же базе данных, написанные на Java или C #, и у них, похоже, нет проблем.
Я пытался добавить код перед вызовом метода .Execute:
проверить соединение сеанса (session.CheckConnection (true); всегда возвращается как 'ccOK').
посмотреть, могу ли я получить доступполе объекта qryAlarmList, чтобы увидеть, может быть, он стал нулевым;может получить к нему доступ.
проверить состояние qryAlarmList;всегда говорит, что это qsIdle.
У кого-нибудь есть какие-то предложения, чтобы попробовать?Это сводит меня с ума!
Дэйв