Je rencontre un problème étrange avec une ancienne application Delphi perdre sa connexion de base de données. En fait, je pense que c'est perdre quelque chose d'autre qui fait alors tomber la connexion ou être inutilisable. L'application est écrite en Delphi 6 et utilise le composant Direct Oracle Access (v4.0.7.1) pour se connecter à une base de données Oracle 9i. L'application s'exécute en tant que service et interroge périodiquement la base de données à l'aide d'un objet TOracleQuery (qryAlarmList). La méthode qui est appelée à faire cela ressemble à ceci:App perdre connexion db
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;
Il avait été en cours d'exécution bien pendant des années, jusqu'à ce qu'un couple de scripts Perl ont été ajoutés à cette machine. Ces scripts s'exécutent toutes les 15 minutes et recherchent des fichiers de données à importer dans la base de données, puis ils effectuent quelques calculs et un tas de lectures/écritures vers/depuis la base de données. Pour une raison quelconque, lorsqu'ils traitent de grandes quantités de données et que l'application Delphi tente d'interroger la base de données, l'application Delphi lève une exception sur la ligne "qryAlarmList.Execute" dans la liste de code ci-dessus. L'exception est toujours:
Access violation at address 00000000. read of address 00000000
COMMENT quelque chose que les scripts Perl font peut-être provoquer? Il y a d'autres scripts Perl sur cette machine qui chargent des données en utilisant les mêmes modules et appels de méthodes et nous n'avons pas eu de problèmes. Pour le rendre encore plus bizarre, il y a deux autres applications qui perdront soudainement leur capacité à parler à la base de données en même temps que les choses Perl sont en cours d'exécution. Aucune de ces applications n'est exécutée sur cette machine, mais les deux sont des applications Delphi 6 qui utilisent le même composant DOA pour se connecter à la même base de données. Nous avons d'autres applications qui se connectent à la même base de données, écrites en Java ou en C# et qui ne semblent pas avoir de problèmes.
J'ai essayé d'ajouter le code avant que la méthode '.Execute' est appelé à:
vérifier la connexion de la session (session.CheckConnection (true); revient toujours comme 'ccOK') .
voir si je peux accéder à un champ de l'objet qryAlarmList pour voir si peut-être devenir nul; peut y accéder bien.
vérifier l'état de la liste qryAlarmList; dit toujours que c'est qsIdle.
Quelqu'un a des suggestions de quelque chose à essayer? Ça me rend dingue!
Dave
Mon raisonnement correspond le vôtre. J'ai demandé à notre DBA de vérifier la fin de la base de données pour tout ce qui semblait «faux» et elle a dit qu'elle n'a trouvé aucun problème enregistré ou aucun problème avec la base de données. – DaveKub