Bonjour,
Mon application tourne sur une DB access.
Depuis peu, j'ai un problème de "trop d'utilisateurs actifs".
En fouillant, j'ai compris que c'était parce qu'access n'accepte que 255 locks en même temps sur la base de donnée.
Je ne devrais pas avoir de soucis vu que je n'ai jamais autant d'utilisateurs connectés en même temps (ni même tout court).
J'ai finis par trouvé d'où ça vient.
J'ai un champ "Online" dans ma table utilisateur de type true or false.
Il me permet d'éjecter un ou plusieurs utilisateurs (pour les forcer à se mettre à jour par exemple).
Dans le form principale de l'application, il y a un timer qui vérifie l'état de ce champ toutes les 10 secondes.
...et toutes les 10 secondes, un nouveau lock est créé sur la base de donnée....
Donc, les locks sont rapidement tous occupés et l'accès à l'application n'est plus possible.
Ce que je ne comprends pas, c'est que dans le code qui s’exécute toutes les 10 secondes, je fais la requête SQL qui vérifie l'état du champ "online" et quand j'ai terminé avec je fait un Dispose() de la commande et un Close() de la connexion avec la DB.... mais visiblement, le Close() ne libère pas le lock.
En écrivant ce message, en fait je pense que c'est logique.
Toutes les 10 secondes un lock se créé et même si il est lâché automatiquement, il reste là pour éventuellement être réattribué à quelqu'un d'autre.
...jusqu'au moment où trop de personnes sont actives en même temps, donc trop de timers tournent et tous les locks sont pris...
Mais alors, comment je peux faire pour éjecter les utilisateurs lorsque c'est nécessaire ?
Il y a une meilleure technique pour faire ça ?
Merci pour vos idées![]()
Partager