Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mise à jour entre 2 bases

Multithreading sur une base SQLite

    26 octobre 2022 à 10:37:51

    Bonjour à tous,

    Nouveau emploie avec nouveau langage dont le SQL.

    Le projet déjà en service à quelques bug bien gênant avec des données manquantes et parfois bloquante dans les bases, mon rôle étant donc de trouver la faille et la combler.


    On a 2 bases (Minimum), l'une en Sqlite sur les postes locaux et l'autre sur un serveur avec MySql, chaque postes individuel doit pouvoir fonctionner hors connexion. Donc la base SQLite est synchronisé avec celle distante, MySQL toutes les 5 minutes environ.

    Fonctionnement: Je simplifie, l'utilisateur a un badge qui contient des données, il s'en sert pour rentrer dans un local (après avoir renseigner des informations), cela enregistre sur le poste local. Mais il peut parfaitement sortir en pointant sur un autre poste, d'autre données seront sauvegardées.

    Le logiciel sur chaque poste synchronise donc tout cela toutes les 5 minutes vers la base distante.

    Problème potentiel que j'ai relevé pour le moment:

    Le logiciel en local, en C# est multithread et la synchronisation peut prendre quelques secondes à plusieurs minutes suivant les sites et la quantité de données a synchroniser. L'utilisateur peut parfaitement badger pendant qu'il y a une synchronisation et cela prend aussi quelques secondes suivant la rapidité de l'utilisateur, donc les 2 threads (synchro et badge) attaque la même base local (SQLite) qui selon mes connaissance actuels ne peut accepter qu'une seule connexion en même temps et pour le moment, chaque action ouvrant et fermant la connexion à la base.

    Même si j'ai fait quelques tests, il semble que si la base est déjà ouverte par un thread, le 2eme essayant de se connecter va se bloquer, mais attend avant de déclencher l'évent d'erreur, mais il me semble que ce n'est pas très judicieux de le laisser comme cela. 

    Autre points qui me parait bizarre, pendant la synchronisation, il y a des suppressions de données dans la base local avant de les récupérer (principalement pour récupérer les ID) sur la distante. La encore s'il y a aussi le badge au même moment il pourrait manquer des informations puisque supprimé !!! pas top tout sa.

    Je ne peux malheureusement pas tout refaire, mais j'ai des pistes, je ne sais pas vraiment comment les aborder vu mes compétences dans les BDD.

    1) Déjà pour éviter tout risque, lorsque le badge est présent, interdire la synchronisation. Je la met en pause et elle se fera quand le badge sera enlevé.

    2)Si le badge est détecté alors que la synchronisation est en cours (parfois quelques minutes, ont ne peut pas attendre), donc utiliser une base tampon, qui serait le reflet de la base local d'origine. La partie badge serait lu et inscrite dans cette base tampon. Une fois fini, et la synchro fini, elle met à jour la base local d'origine.

    Je pense que cette mécanique serait pas mal, au niveau du fonctionnement j'ai juste à rediriger les fonctions du badge vers la BDD tampon.

    -->J'ai déjà appliqué la mise en pause de la synchro (partie 1) quand c'est possible.

    Maintenant mes questions débutant dans le monde SQL:

    3) Comment créer la base tampon ? 

    ----Un simple copier coller

    ----Une fonction SQL pour copier une base complète vers une autre.

    ----Et quand la créer, je pensais la faire juste avant la synchro. La faire après semblerait plus intéressante, mais au risque qu'un badge soit en cours.

    4) Comment mettre à jour la tampon vers la Local de base?

    ---Je ne peux pas faire un copier coller dans ce sens, car la synchro sera peut être en cours et/ou aura modifié des données.

    ---Ya t'il des fonctions SQL qui peuvent faire sa. (en écrivant cette phrase je m'aperçois que ce serait compliqué, car la synchro aura changé des Id par exemple, sur les données contenant la date d'entrée et attendant la date de sortie. Il y a aussi des champs qui indiquent si la synchro avec la distante a été faite ou pas)

    En bref : 

    Le Copier Coller entre la base local vers la tampon serait rapide et efficace, mais peut être pas très propre, ne connaissant pas les pratiques dans ce domaine.

    Et la tampon vers la Local, me gène un peu plus, je ne sais pas vraiment comment l'aborder. Des fonctions SQL existante, mais j'en doute.

    Merci de votre aide. 

    -
    Edité par Magiquall 26 octobre 2022 à 10:43:51

    • Partager sur Facebook
    • Partager sur Twitter
      26 octobre 2022 à 13:10:43

      Bonjour,

      Déplacement vers un forum plus approprié

      Le sujet est déplacé de la section Base de données vers la section Discussions développement

      J'oublierais cette idée de base tampon qui ne va que rajouter de la complexité au projet.

      J'ajouterais une colonne côté local nommée "flag_synchro" de type booléen passant à 1 lorsque le serveur central a récupéré la donnée

      J'ajouterais un identifiant unique à chaque événement (passage de badge) type UUID, côté local et côté serveur

      Je fonctionnerais de cette manière : à chaque insertion ou mise à jour sur l'appli locale, on insère/met à jour en base avec flag = 0, on teste la connexion au réseau, et si la connexion est OK on envoie l'enregistrement au serveur. Si retour OK alors flag = 1, en utilisant l'UUID. Si connexion NOK, on attend la reprise normale et on envoi tous les enregistrements flag = 0.

      Ainsi, c'est l'appli local qui pilote les échanges avec le serveur, sans programmer une synchronisation périodique par le serveur.

      Côté serveur, l'appli ne crée qu'une seule connexion à la base, persistante.

      -
      Edité par Benzouye 26 octobre 2022 à 13:12:20

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

      Mise à jour entre 2 bases

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown