Question

Je sais que le post est long, mais il contient également des suggestions de solutions à mon problème.Par conséquent, la question elle-même n'est pas si longue...n'ayez pas peur.:)

S'il vous plaît aidez-moi avec le scénario suivant:

Je vais avoir un serveur SQL server où je vais stocker des ensembles de données.Je vais aussi avoir un tas de PC clients (toutes avec leur propre serveur SQL local) qui devront être synchronisé avec le serveur.Le Pc va être identifié de façon unique.

Exemple:

Disons que j'ai 2 PC clients, PC1 et PC2.

Sur le serveur, j'ai les ensembles de données suivants:

DS1 DS2

Sur le Pc client, je n'aurai rien pour commencer.Lorsque PC1 va se connecter au serveur pour voir si "tout ce qui est nouveau", il note qu'il existe deux ensembles de données qu'il a besoin de récupérer, donc il va mettre à jour sa base de données locale avec DS1 et DS2.La même chose se produira avec le PC2.Maintenant, disons que le PC2, localement, modifie DS2.Lorsque PC2 va se connecter au serveur, elle sera mise à jour DS2 sur le serveur avec les modifications qu'il fait de ses locaux DS2.Enfin, lorsque PC1 permettra de vous connecter à nouveau pour voir si il y a des changements, il remarque que DS2 a changé et qu'il va le récupérer et l'écraser ses locaux DS2 avec le DS2 à partir du serveur.

Ne vous inquiétez pas sur les problèmes de simultanéité, car tous les Pc peuvent changer n'importe quel ensemble de données.Seul le propriétaire d'un certain ensemble de données peut changer (le propriétaire étant définie comme un seul PC.)

J'ai pensé à quelques solutions, mais ils ne semblent pas très efficace;peut-être quelqu'un d'autre aura quelques idées.

1ère Solution:

Sur le serveur, je vais créer une table appelée "SyncTable" où je vais écrire sur les jeux de données.

Exemple:

Disons que PC1 doit récupérer DS1 et PC2 a besoin de récupérer des DS4 et DS5.

La table de synchronisation contient:

PC1 DS1
PC2 DS4
PC2 DS5

Donc, quand PC2 se connecte au serveur, il regarde ce tableau, les notes qu'il a besoin de télécharger des DS4 et DS5, va de l'avant et ne que des et puis il supprime ses deux entrées de la table de serveur.Ainsi, le serveur de table contiennent uniquement "PC1 DS1" après PC2 synchronisés lui-même.La prochaine fois, quand PC2 se connecte, note qu'il n'y a pas d'entrées pour elle et sait donc qu'il est "up to date".Lorsque PC1 relier, exactement la même chose allait se passer:Il tient à préciser qu'elle a besoin de télécharger DS1, téléchargez-le et supprimez l'entrée.

Le problème avec cela est que si il y a 10 000 PCs, et peut-être 5000 ensembles de données modifiées, j'aurais beaucoup d'entrées dans cette table.

La deuxième solution serait de stocker une modification de l'horodatage associé à chaque ensemble de données.Le problème, c'est que le Pc client aurait à passer par TOUS leurs dossiers locaux et de comparer les locaux horodateurs avec le dernier horodatage sur le serveur pour voir si il y a des changements.Vous ne savez pas comment efficace, c'est en raison du grand nombre de dossiers.Il semble que ce serait mieux si ils savent directement sur le lieu de surveiller les changements plutôt que d'aller à travers tous les enregistrements à chaque fois...

Donc, avez-vous des suggestions à ce sujet ?

Technologie utilisée:MS SQL Server Compact Edition 3.5 sur le Pc client et MySQL sur le serveur.Cette communication devra être fait par le biais de services web.Par conséquent, la Réplication de Fusion/Accès aux Données à Distance en sortir.

Merci!

Était-ce utile?

La solution

Vous envisagez de deux options

  1. générer une liste de mises à jour requises au moment de la modification, le client demande "ce qui est dans ma liste de mises à jour"?
  2. en gardant les horodatages de telle sorte qu'un client peut demander "Mon dernier délai pour DSx est ..., ai-je besoin d'une mise à jour?"

Je vois l'option 2 comme prefereable.Je pense qu'il est plus résistant à des problèmes, la récupération à partir d'un client se bloque etc.C'est parce que chaque participant garde seulement ce qu'il sait:la date de ses données.Le serveur n'a pas besoin de "comprendre" qui a pris quoi.

Je pense que vous pouvez optimiser la détermination de ce à télécharger.Vous parlez comme si le client a besoin de parcourir tous les ensembles de données, retrieveing à chaque fois un timbre à la fois, et de prendre une décision pour récupérer.Au lieu de cela, vous pourriez avoir un appel de service web:

I have DS1=<time>, DS2=<time> ...; which do I need to download?

La décision est faite par le serveur sur la base des données transmises par le client, plutôt que le client de l'extraction de données pour lui permettre de prendre la décision lui-même.

En passant, je tiens à souligner qu'il existe des produits commerciaux de gérer tout cela.Avez-vous vraiment besoin de ce code?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top