Question

Je suis à la recherche Mise en veille prolongée pour un système qui a besoin de travailler dans un réseau non fiable. Il y a une seule base de données centrale que nous avons besoin d'un accès en lecture-écriture, mais il est disponible sur un joli parcellaire réseau wi-fi. De plus, il peut y avoir des pertes de puissance qui ne se arrêtent pas l'application proprement, de sorte que toute solution doit avoir un cache persistant qui peut survivre à des cycles de puissance. Enfin c'est un système embarqué avec seulement la mémoire modeste, et l'espace disque ainsi par exemple faire la réplication complète de la base de données soufflée n'est pas une stratégie possible.

J'ai une compréhension de base de mise en veille prolongée 2e niveau mise en cache, et je me demande s'il est possible de configurer ce avec quelque chose comme Ehcache pour résoudre ce problème, mais l'objectif principal de qui semble être la performance non disponibilité, donc je suis pas au courant de ce que les pièges pourraient être.

Je suis également tout à fait prêt à envisager d'autres stratégies qui impliquent la réplication à une base de données locale. Je préférerais ne pas avoir à faire trop de lourds me soulever à mettre en œuvre.

Vous recherchez une expérience ou d'alternatives possibles.

Était-ce utile?

La solution 6

Le réplicateur Jonquille (http://enterprise.replicator.daffodilsw.com/index.html) permet la réplication entre les sources JDBC. Il supporte les mises à jour bidirectionnelle, la fusion et la résolution des conflits et des répliques partielles.

Ceci peut être utilisé pour synchroniser la base de données principale avec une réplique locale (partiel). Vous pouvez utiliser hibernate pour parler à la base de données réplique locale et ont fini tout le reste en dehors de ce processus.

Autres conseils

« En outre, il peut y avoir des pertes de puissance qui ne se arrêtent pas l'application proprement, de sorte que toute solution doit avoir un cache persistant qui peut survivre à des cycles de puissance. »

Vous avez déjà une solution dans votre esprit avec un cache de niveau 2 Mise en veille prolongée. Mais vous ne dites pas quels sont les besoins réels. Vous disposez d'un réseau unrealiable. C'est OK, vous avez l'alimentation unrealiable. C'est bien aussi. Maintenant, quel niveau de service que vous voulez atteindre? Ce qui est acceptable ou non?

est la perte de données acceptable? Combien pourriez-vous accepter? Quel risque acceptez-vous?

Pour être plus explicite, nous allons dire que vous avez une réplique locale de la base de données ou au moins une partie de celui-ci. Disons que vous savez comment la file d'attente / enregistrer la modification faite localement. Laissez-vous dire stocker la modification des thèses sur un disque dur afin d'être en sécurité en cas de panne de courant. Disons que vous êtes en mesure de fusionner les modifications avec la base de données principale lorsque la connexion est avaialable à nouveau.

C'est déjà beaucoup d'hypothèses. Ok, mais ce qui se passe si l'on échoue après un HardDrive powerfailure? Vous savez que harddrive ne le font pas comme une panne de courant et ont tendance à être corrompu en cas d'échec d'alimentation ou même peut être endommagé?

Si vous mettez sur un RAID, et d'ajouter une alimentation sans coupure. C'est zonte. Votre événement détecter une panne de courant de l'OS. Terminez votre transaction en cours et l'arrêt correctement. Vous RAID vous protéger d'une défaillance du disque.

Ok, mais ce qui se passe si l'ensemble d'arrêt de fonctionnement ordinateur? Qu'arrive-t-en cas d'incendie? Ou les dégâts d'eau? Tous les disques seront gérées, les données irrécupérables et ce ne sont pas synchronisées avec la base de données centrale est perdue. Est-il acceptable ou non?

Même si le wifi est activé, le travail d'alimentation parfaitement ... Quelle est la fiabilité de la base de données centrale de toute façon? Avez-vous des sauvegardes régulières? Ou une solution de clustering? Êtes-vous sûr que votre base de données centrale est de toute façon fiable?

D'un point de vue de la base de données, il est facile d'utiliser un cluster ou de sauvegarde et les transactions pour assurer l'utilisation dataconsistency. Vous pouvez toujours perdre des données (sinon en utilisant un cluster en particulier), mais vous devriez être en mesure de récupérer jusqu'à la dernière sauvegarde par exemple.

Mais si vous voulez travailler hors connexion (avec base de données non disponibles), et vous n'êtes pas le seul qui peut modifier la base de données, des conflits se produit. Ce n'est plus un cache, mise en veille prolongée ou quoi que ce soit problème technique.

Ce problème est fonctionnel. Que faire lorsque plusieurs modifications se produit hors ligne et vous devez fusionner? Ce qui est acceptable? Ce qui n'est pas. Cela pourrait être que le rebranchement, appliquer le changement le plus récent, les changements plus âgés sont mis au rebut. Ou les conflits ptential sont détectés et demande à l'utilisateur de traiter avec eux. Vous pouvez essayer d'appliquer les changements mis en attente et appliquer tous ...

Je aurais tendance à considérer que vous pouvez offrir un « mode hors ligne », mais les utilisateurs doivent être conscients qu'ils sont hors ligne, et devrait avoir une notification lorsque le changement sont faits sur la base de données centrale permanente de la résolution éventuelle de conflits. Mais que mon point de vue.

Vous ne pouvez pas espérer réussir avec un réseau comme celui entre mise en veille prolongée et la base de données.

Je vous recommande de définir un ensemble d'opérations atomiques de haut niveau, puis définir un ensemble de services (par exemple) reposant pour eux. Ou, si vous le souhaitez, vous pouvez utiliser du savon et de regarder dans le WS- * Les options de messagerie fiable pour prendre soin de réitérations et tous les autres détails de désordre.

Ou, vous pouvez vérifier si quelque chose comme cassandra à travers le lien fonctionnerait mieux que SQL, ou quelque chose d'autre grand sur la réplication.

Que diriez-vous de faire la queue db opérations sur une file d'attente d'un message durable / persistant, et laisser une messagerie middleware gérer le problème de réseau?

Selon la façon dont vous le faites, les problèmes de cohérence (bien, « anomalie » est le mot juste, je suppose) peut se produire, mais si vous avez réseau peu fiable et veulent toujours des performances décentes, régler alors la cohérence détendue pourrait être le moyen de aller.

Je hésiter à utiliser ehcache etc. Ils ne sont pas conçus pour cela et par conséquent, vous pourriez avoir à « étirer » le cadre. les files d'attente de messages, d'autre part ont des solutions qui ont été conçus pour de tels scénarios.

Si elle était juste un cas de connexion sporadique entre les deux machines, je recommande la tenue d'un journal des transactions qui peuvent être lues et chaque entrée marquée comme traitée. La mémoire limitée peut faire ce difficile, cependant.

Peut-être que vous pouvez stocker le journal des transactions comprimé, cependant.

Mise en veille prolongée (et le cache de second niveau) sont vraiment pas conçu pour cela. Je pense que vous seriez probablement mieux loti en utilisant une petite échelle embarqué Java RDBMS (par exemple H2 ou HSQLDB) que votre file d'attente temporaire locale (dans le mode le plus durable disponible) puis effectuez la synchronisation avec un fil d'arrière-plan. Vous pouvez ensuite fournir une interface de synchronisation spinner relié à ce fil d'arrière-plan pour fournir un certain degré de rétroaction pour l'utilisateur.

Par ailleurs, Hibernate est un peu gras à jeter dans un environnement embarqué. Vous voudrez peut-être envisager de mybatis à la place.

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