Приложение теряет связь с БД - PullRequest
2 голосов
/ 11 июня 2010

У меня странная проблема со старым приложением 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.

У кого-нибудь есть какие-то предложения, чтобы попробовать?Это сводит меня с ума!

Дэйв

Ответы [ 5 ]

1 голос
/ 11 июня 2011

Дейв, у меня та же проблема, но не запущен perl или другой процесс.Я увидел, что мой dracle db был с SGA_MAX_SIZE ниже необходимого, но я не могу завершить работу в этот момент, потому что это производственный db, и у меня есть это предупреждение для пользователей.

Пожалуйста, посмотрите / измените параметры базы данных и дайте намобратная связь

Удачи.Allisson

Ps: извините, мой плохой английский

1 голос
/ 11 июня 2010

Похоже, что-то сбрасывает слушателя.Пусть dba проверит различные журналы, чтобы увидеть, отскакивает ли слушатель при выполнении этих заданий perl.Или проверьте, чтобы видеть, остается ли PID (идентификатор процесса) слушателя весь день, или он скачет, когда выполняются эти задания perl.

1 голос
/ 12 июня 2010

«Нарушение доступа по адресу 00000000. Чтение адреса 00000000» имеет очень специфическое значение. Это почти наверняка означает, что что-то пытается вызвать виртуальный метод по ссылке на объект nil . Если это не является чем-то очевидным, попробуйте пересобрать с отладочными DCU и запустить под отладчиком. Он должен сломаться и показать вам, где именно проблема.

Кроме того, вы упомянули, что находитесь в Delphi 6, и это происходит только с большими наборами данных. В этом случае вы можете посмотреть на FastMM4, менеджер замены памяти. В старом диспетчере памяти BorlandMM были некоторые проблемы, которые могли приводить к нарушениям доступа при работе с большими объемами данных, и FastMM их исправляет.

1 голос
/ 11 июня 2010

Если другие приложения на других машинах также теряют связь с БД, я бы исследовал на стороне БД и посмотрел бы там (вытащить статистику перфектов, логи, ...).
Возможно, скрипты Perl вызываютнекоторые ресурсы засоряются на сервере БД, блокируя другие попытки доступа.
И это может быть связано с тем, как соединяются приложения D6, оставляя другие C #, java ... работоспособными?

Мое рассуждение состоит в том, что я вижу только БД в качестве общего звена в теряющем соединение MachineA / D6 и теряющем соединение MachineB / D6 ...

Надеюсь, это поможет

0 голосов
/ 12 июня 2010

DOA v 4.0.7.1 - 5 лет. Почему бы просто не попробовать обновить DOA до последней версии?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...