Bonjour à tous,
j'ai mis en place un module de supervision des utilisateurs connectés sur mon appli de gpao.
aujourd'hui que l'appli est vraiment utilisée (une vingtaine d'utilisateurs), je me rends compte que ça ne fonctionne pas correctement.
Voici comment je m'y prends :
J'ai une table logg dans ma base SQL Server qui contient les champs suivants :
- log_session_id, int champs auto (identifiant de session)
- log_uid, int (identifiant de l'utilisateur)
- log_ip_address (IP du poste client)
- log_start (debut de session)
- log_last_update (dernière activité)
- log_end (fin de la session suite à déconnexion ou à purge)
Quand un utilisateur ouvre une session sur la gpao, alors j'exécute la procédure declareSession() :
1 2 3 4 5 6 7 8 9 10 11
|
tic est une DateHeure = DateHeureSys()
// création de l'entrée dans la table logg
HRAZ(logg)
logg.log_start = tic
logg.log_last_refresh = tic
logg.log_uid = FEN_START.uid
logg.log_ip_address = ip_client // je passe sur la façon dont j'obtient l'ip, ce n'est pas ce qui nous intéresse
HAjoute(logg)
FEN_START.sid = logg.log_session_id |
Ensuite, j'exécute toutes les 2 minutes (par un timer) la procédure updateSession() qui contient un appel à la procédure stockée du même nom sur mon serveur SQL :
appel via le timer :
1 2 3 4
| updateSession()
SI Timer("updateSession", 100*60*2) = 0 ALORS
Erreur("Création du timer impossible")
FIN |
la procédure WinDev updateSession() :
1 2 3 4 5 6 7 8
| ProcedureStockee est une Source de Données
Sql est une chaîne = "EXECUTE [GPAO].[dbo].[updateSession] @sid=" + sid + ", @interval=5;"
//trace(Sql)
SI PAS HExécuteRequêteSQL(ProcedureStockee,Cnx,hRequêteSansCorrection,Sql) ALORS
Erreur("Erreur d'initialisation de la requête"+RC+HErreurInfo() + RC + RC + Sql)
RETOUR
FIN
HLibèreRequête(ProcedureStockee) |
Enfin, la procédure stockée SQL Server, qui va updater l'entrée de la table logg qui concerne la session en cours, et purger les entrées trop vieilles (si log_end est null et log_last_refresh est plus vieux que 5 minutes) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| ALTER PROCEDURE [dbo].[updateSession]
-- Add the parameters for the stored procedure here
@sid int,
@interval int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- d'abord on update la session en cours @sid
UPDATE logg SET log_last_refresh = SYSDATETIME() WHERE log_session_id = @sid
-- ensuite on purge les vieilles sessions (appli plantée, session mal fermée)
UPDATE logg SET log_end = SYSDATETIME() WHERE log_end is null AND datediff(s, log_last_refresh, SYSDATETIME())/60 >= @interval
END |
Quand je test moi-même, en regardant évoluer log_last_refresh toutes les 2 minutes, j'ai l'impression que tout fonctionne bien. Pourtant il y a des utiisateurs connectés pour lesquels log_end a été renseigné et donc ils sont considérés comme déconnectés. Voyez-vous dans mes programmes ce qui pourrait être la cause de ça ? A priori c'est un problème d'update qui ne se fait pas et donc log_last_refresh n'évolue plus et devient trop vieux, donc un des nombreux appels à updateSession (de la part d'autres utilisateurs) fini par mettre un terme à la ligne de logg en renseignant log_end.
D'avance merci pour toute piste qui m'aidera à faire fonctionner ce module
![;)](https://www.developpez.net/forums/images/smilies/icon_wink.gif)
Partager