Oui, mais tu ne pourras pas faire des requêtes qui utilisent les 2 BDD en même temps.
Si tes tables sont "petites" et que tu es certains qu'elle ne deviendront pas traitable en 1 passe (ce qui sous entends que tu peux rapatrier la totalité des enregistrements des 2 BDD en mémoire), c'est relativement simple.
- Tu requêtes les 2 BDD
- Tu compares les 2 listes résultantes
- Tu effectues les traitements
Sinon grosses tables (là c'est beaucoup plus lourd)
Il est préférable de faire les requêtes avec un critère correspondant à la dernière date de synchro (Tu stockes la date de synchro dans une table options par exemple)
Pourquoi ce choix ? si ta synchro génère des millions d'enregistrements, tu ne pourras pas le faire en 1 passe, tu coup tu seras obligé de faire des lots et la méthode avec la comparaison sur les id avec les lots ne fonctionne pas. (enfin du moins je ne l'ai jamais utilisé et sa me paraît difficile de prime abord)
- Donc récupération de la précédente date de synchro -> prevSynchro
- Stocker date système en UTC dans -> dateNouvelleSyncrho
- Requête sur la 1iere BDD :
from item in mysqlite.table where creation_time > prevSynchro select item
- Mise à jour de la 2ième BDD
- Mise à jour de la date de synchro des enregistrements de la BDD1 avec dateNouvelleSynchro
- stockage de la nouvelle date de synchro dans la table option <- dateNouvelleSynchro
Par contre plein de piège possible :
- Déjà si tes id sont des int, tu peux te retrouver avec l'id 1 créer sur les 2 BDD, les 2 étant nouveaux et la c'est mort. Il est donc préférable de passer par des id de type Guid
- Sur la date de synchro, vu que tu utilises une date locale à ton PC, il est possible que les serveurs de BDD qui alimente le creation_time ne soient pas à la même heure et du coup tu vas perdre des enregistrements.
Pour sécuriser cela il est préférable de prendre une marge lors de la requête :
from item in mysqlite.table where creation_time > prevSynchro.AddDays(-1) select item
Par contre cela va te ramener des enregistrements déjà traiter, il faudra donc lors de la mise à jour vérifier que les enregistrements sont effectivement à traiter.
- l'autre solution possible pour éviter les dateDeSynchro, c'est à chaque fois que tu ajoutes ou modifies un enregistrement dans une des 2 BDD, tu poses un flag aSynchro = true sur l'enregistrement
du coup ta requête devient
from item in mysqlite.table where aTraiter select item
mais du coup il faut pas oublier de poser le flag !!!! (si ton code est centralisé c'est gérable, si tu créer des enregistrements avec un code spécifique à chaque fois, c'est sûr que tu vas oublier le flag un jour)
- un problème sur lequel il faut arbitrer c'est : que faire quand on a une mise à jour d'un même enregistrement sur les 2 BDDs.
- penser à gérer les enregistrements supprimés
- Bien sûr penser à faire des traitements par lots, si ta synchro génère 1 000 000 d'enregistrement à traiter, il faudra le découper en lots.
- Il y a sûrement d'autres pièges à éviter, mais sa fait un moment que je n'ai pas eu à faire de synchro moi même !!
Partager