Bonjour à tous,
J'ai mis en place un système de log d'exécution des procédures stockées.
Cela me permet d'avoir la pile d'exécution (application -> service web > proc stock), les temps d'exécution, ...
Pour ce faire j'ai créé 3 procédures stockées :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 CREATE PROCEDURE `pcdTrace1`(IN `_Texte` TINYTEXT, IN `_Appelant` TINYTEXT) BEGIN INSERT INTO Traces(Libellé,Appelant) VALUES (_Texte,_Appelant); ENDRemarquez le OUT `_IDTracesAppel qui est récupéré par les appelantes via @IDTracesAppel
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 CREATE PROCEDURE `pcdTraceAppelNiv1_Début`(IN `_NomFonction` TINYTEXT, IN `_CtxAppelNiv1` TINYTEXT, OUT `_IDTracesAppel` INT(10) UNSIGNED) BEGIN INSERT INTO TracesAppel(NomFonction,CtxAppelNiv1,AppelantNiv1,Début,NoCnx) VALUES (_NomFonction,_CtxAppelNiv1,USER(),sysdate(6),CONNECTION_ID()) ; SELECT LAST_INSERT_ID() INTO _IDTracesAppel; END
Une procédure de test :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 CREATE PROCEDURE `pcdTraceAppel_Fin1`(IN `_IDTracesAppel` INT(10) UNSIGNED, IN `_Appelant` TINYTEXT) BEGIN DECLARE Maintenant DATETIME(6); UPDATE TracesAppel SET Fin=Maintenant, Durée=TIMEDIFF(Maintenant,Début) WHERE IDTracesAppel=_IDTracesAppel ; IF ROW_COUNT()=0 THEN CALL pcdTrace1(CONCAT_WS('','Erreur - TracesAppel.IDTracesAppel=',_IDTracesAppel,' est trouvable'),CONCAT_WS('->',_Appelant,'pcdTraceAppel_Fin1')); END IF; END
Mon problème c'est que lors du lancement de pcdTraceAppel_TestAppelNiv1() j'ai de temps en temps des erreurs m'indiquant que IDTracesAppel n'a pas été trouvé (tracé car ROW_COUNT()=0)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 CREATE PROCEDURE `pcdTraceAppel_TestAppelNiv1`() BEGIN CALL pcdTraceAppelNiv1_Début('pcdTest','test',@IDTracesAppel); SELECT BENCHMARK(1000000,ENCODE("bonjour","au revoir")); CALL pcdTraceAppel_Fin(@IDTracesAppel); END
Or, si je consulte la table TracesApppel, je vois le IDTracesAppel en question !
Cet enregistrement contient des valeurs pour tous les champs (NomFonction, AppelantNiv1,Début) mais reste NULL pour Fin et Durée
Et ces erreurs sont encore plus régulières voire quasi systématique si j'exécute directement depuis l'éditeur de requête (HeidiSQL) or proc stock pcdTraceAppel_TestAppelNiv1()
J'ajoute que ces procédures sont très fortement sollicitées (plusieurs milliers d'appels par minute)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 CALL pcdTraceAppelNiv1_Début('test','test',@IDTracesAppel); SELECT @IDTracesAppel; SELECT BENCHMARK(1000000,ENCODE("bonjour","au revoir")); CALL pcdTraceAppel_Fin1(@IDTracesAppel,'test');
Voilà si l'un d'entre vous a un début de commencement d'idée...
Merci d'avance.
Partager