IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Locks multiples sur DB Access


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    IT Manager
    Inscrit en
    Janvier 2018
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Manager
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2018
    Messages : 220
    Par défaut Locks multiples sur DB Access
    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

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    Suggestion : si tu peux faire un Lock, tu peux certainement faire aussi un UnLock, non ?
    Alors, puisqu'un Lock "éjecte" un utilisateur (si j'ai bien compris), un fois éjecté il peut être "dé-locké", l'idée est que toutes les 10 secondes, quand tu commandes un Lock, tu pourrais commencer par faire un UnLock du précédent.

    ...

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    Suggestion, passer sur une vraie base de données réellement prévue pour du multi utilisateur...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre expérimenté
    Homme Profil pro
    IT Manager
    Inscrit en
    Janvier 2018
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Manager
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2018
    Messages : 220
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    Suggestion, passer sur une vraie base de données réellement prévue pour du multi utilisateur...
    Ha bin oui bien entendu.
    Sauf que mon patron ne veut pas qu'on achète des licences pour une vraie DB.........
    En plus de ça, je devrais réécrire presque tout mon code

    Citation Envoyé par Phil Rob Voir le message
    Bonjour,

    Suggestion : si tu peux faire un Lock, tu peux certainement faire aussi un UnLock, non ?
    Alors, puisqu'un Lock "éjecte" un utilisateur (si j'ai bien compris), un fois éjecté il peut être "dé-locké", l'idée est que toutes les 10 secondes, quand tu commandes un Lock, tu pourrais commencer par faire un UnLock du précédent.

    ...
    Hello,

    Non, c'est Access qui gère les locks tu n'as pas du tout la main sur ce truc.
    Tu peux seulement faire de la lecture dessus.
    C'est lui même qui s'occupe des réattribuer un lock qui n'est plus utilisé.

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    Citation Envoyé par thovan Voir le message
    Ha bin oui bien entendu.
    Sauf que mon patron ne veut pas qu'on achète des licences pour une vraie DB.........
    En plus de ça, je devrais réécrire presque tout mon code
    Sql server express est gratuit (base jusqu'à 10Go)
    Et si c'est pas trop mal codé ça se migre assez vite, la plupart des requêtes peuvent fonctionner sans modification.
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre expérimenté
    Homme Profil pro
    IT Manager
    Inscrit en
    Janvier 2018
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Manager
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2018
    Messages : 220
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    Sql server express est gratuit (base jusqu'à 10Go)
    Et si c'est pas trop mal codé ça se migre assez vite, la plupart des requêtes peuvent fonctionner sans modification.
    Ok, merci du tuyaux
    Et sinon techniquement, une autre technique pour éjecter des utilisateurs ?

  7. #7
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    C'est lui même qui s'occupe des réattribuer un lock qui n'est plus utilisé.
    Je m'en doutais bien que je ne sois pas spécialiste d'Access ...
    Et je pense aussi que Access gère les mises à jour des postes client (j'ai un exemple sous les yeux où la modification d'une info sur un poste est automatiquement à jour sur tous les autres postes).

    Il y a ainsi 2 choses que je ne comprends pas :
    1. Puisque Access gère les Lock-Unlock, comment se fait-il que cela finisse par bloquer, est-ce bien les Lock qui sont en cause ?
    2. Pourquoi dois-tu forcer des Déconnections d'utilisateurs, vu que cela n'est pas nécessaire pour les mises à jour ?


    Avant Access 2007 (je crois), il était possible de régler le niveau de protection des données d'Access en définissant une propriété (±RecordLock) à "Aucun Lock", "Lock Record Edited" et "Lock Table" ..., cela n'existe-t-il plus ? (en supposant que ça puisse améliorer ton problème).

    ...

  8. #8
    Membre expérimenté
    Homme Profil pro
    IT Manager
    Inscrit en
    Janvier 2018
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Manager
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2018
    Messages : 220
    Par défaut
    Re,

    Pour le 1 : parce que access créé un nouveau lock toutes les 10 secondes lors de la vérification du statut du champ "online". Quand trop d'utilisateurs sont présents en même temps, il arrive au maximum des 255 locks autorisés.
    en général, une fois que je suis vers 10-11 utilisateurs connectés en même temps ça va très vite.... toutes les 10 secondes tu rajoutes 10-11 locks.... les 255 sont très vites atteint.

    Pour le 2 : je parle de mises à jour de l'application. Elle se déploie avec click once, donc à chaque nouvelle exécution, elle commence par vérifier si elle doit se mettre à jour. Comme j'ai des utilisateurs qui ne se déconnectent jamais, ils ne sont jamais
    à jour sur les nouvelles fonctions et corrections des bugs. Je me suis donc arrangé un moyen de forcer ces utilisateurs à se mettre à jour en forçant une déconnexion.

    Dans un 1er temps, je vais mettre la vérification du statut toutes les 10 minutes au lieu de 10 secondes.... ça sera pas super réactif mais c'est déjà un début

  9. #9
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Ok, je comprends, il ne s'agit pas la mise à jours des données, mais bien de l'application !

    Et je comprends que des utilisateurs ne se déconnectent jamais ... mais est-il bien nécessaire de faire des mises à jour de l'application toutes les 10 minutes ? une fois toutes les 24h devrait être amplement suffisant ! Et au moins, tu pourrais programmer un batch de mise à jour qui s'exécuterait entre 1 et 2 heures du matin, il y aurait moins d'utilisateurs à déconnecter ..., et tout serait réinitialisé chaque matin ...

    Par ailleurs, je maintiens qu'il doit y avoir une autre raison aux blocages ..., 10 utilisateurs n'est pas beaucoup, pas même pour Access, ...

    Bon courage ...

  10. #10
    Membre expérimenté
    Homme Profil pro
    IT Manager
    Inscrit en
    Janvier 2018
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Manager
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2018
    Messages : 220
    Par défaut
    Attention, je ne vérifie pas les mises à jours toutes les 10 secondes...
    Je vérifie juste si l'utilisateur doit être déconnecté ou pas, option que je déclenche moi via l'interface..... la mise à jour se faisant toute seule à la connexion suivante grâce à ClickOnce.

    Enfin soit, j'y ai réfléchis et je pense que je vais passer ça autrement et faire comme tu suggères, une fois par jour, vers 23h.

    J'ai téléchargé un outil qui permet de visualiser les locks en direct et c'est bien ça, garantis à 100%
    J'ai testé avec seulement mon utilisateur connecté et au bout de quelques minutes j'avais déjà 30 locks rien qu'à moi.....
    A ceux si s'ajoutent bien sur ceux de l'application elle même quand elle sollicite la DB....

    En tout cas merci d'avoir participé à la discussion

  11. #11
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    J'ai téléchargé un outil qui permet de visualiser les locks en direct et c'est bien ça, garantis à 100%
    J'ai testé avec seulement mon utilisateur connecté et au bout de quelques minutes j'avais déjà 30 locks rien qu'à moi.....
    Je te crois sur parole ... mais je me demande comment la DB que je connais en fonction (dans une école de promotion sociale), et qui est utilisée en permanence par près de 10 personnes, de 8 à 22 heures, certaines n'arrêtant jamais leur système ..., comment cette DB ne pose aucun problème semblable au tien ... .
    Faudra que j'interroge un collègue bien au courant de cette DB ..., mais tu le sais, cette semaine, c'est congé de carnaval ...

    Bonne continuation ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. lock conflict sur une req select
    Par veronique dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 02/02/2005, 09h12
  2. select multiple sur plusieurs tables
    Par syl2095 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/12/2004, 15h48
  3. [JDBC][Access] Transaction SQL sur MS Access?
    Par Twofy dans le forum JDBC
    Réponses: 2
    Dernier message: 19/08/2004, 14h46
  4. pointeur multiple sur un objet
    Par Arnaud-h dans le forum C++Builder
    Réponses: 9
    Dernier message: 02/06/2004, 11h33
  5. [VB6] [ADO] Like sur base Access
    Par dlpxlid dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 24/01/2003, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo