# Java > Gnral Java > Persistance des donnes >  Stockage de donnes HSQLDB hors ligne et synchronisation avec BDD principale

## merlin1977

Bonjour,
ma problmatique est la suivante :
j'ai une application java qui s'installe sur un pc qui fonctionne connect  une base de donne mysql.
Je dois pouvoir la faire fonctionner sur des zones non couverte par le wifi.
l'ide est la suivante :
1/ passer en mode hors connexion volontairement : copie des donnes ncessaire de la base principale  une base temporaire.
2/faire les enregistrements localement dans la base temporaire.
3/ lorsqu'on rcupre le wifi synchroniser les donnes avec la base mysql principale.
j'ai vu la base embarqu HSQLDB j'ai pens stocker les donnes temporaire dedans mais je me demande si c'est une bonne solution d'une part et d'autre part si il n'y en a pas une meilleurs.
par ailleurs je me demande si on peut faire des requetes du type insert into (....) (select * ....)
ou le select attaquerait la base temporaire et le insert into la base relle : je ne penses pas que ce soit possible mais bon au cas ou je demande  ::): 
Je fais donc appel  vos lumire, certains d'entre vous ont il dj fait ce genre de choses, je suis preneur de tout retour dexprience et surtout de la meilleurs mthodologie  suivre.
Merci  ::):

----------


## merlin1977

Bonjour,
je vous mets la suite de ma rflexion :

je pensais :
1/intgrer les donne ncessaire au fonctionnement de l'application hors ligne dans hsqlbd dans des tables temporaires.
2/enregistrer les update inset into etc... dans la base temporaire et surtout garder la trace de chacune des transaction dans un ficier texte.
3/exeecuter sur la base relle le contenu du fichier texte ligne a ligne dans le meme ordre insert delete update etc...

Aprs quelques heures de prise de tte a me parait la meilleurs solution pour ralimenter la base relle sans crer de conflit si d'autres utilisateurs font de mme en mme temps qu'en pensez vous ?bonne mthode ? une meilleur ide? je suis preneur de toute rflexion sur le sujet  ::): 

Merci

----------


## DevServlet

Bonjour,

La synchronisation des donnes saisies hors connexion avec le serveur (en ligne) est assez delicate, ce d'autant plus que pendant le fonctionnement ton application en mode non connect, les donnes du serveur principal peuvent aussi tre mises  jour. Je n'ai pas encore eu cette problmatique mais j'aurais tendance  te proposer de mettre en place un batch de synchronisation, qui fonctionnera dans les 2 sens :
1- Dans le sens de Mysql vers Hsqld, c'est une simple crasement/remplacement de donnes
2- Dans le sens HsqlDb vers Mysql, il faudra retrouver les enregistrements en I/U/D ayant boug sur HsqlDB (voire de ton fichier temporaire de transaction), pour les "I/D" aucun souci, les insrer/supprimer dans mysql, mais pour les U, c'est l la situation tordue qui consistera  merger les lignes.
Je suis dsol de ne pas avoir de solution automatique pour ton traitement, mais je reste galement ouvert  une autre solution.

----------


## merlin1977

Merci,
au final dans la partie de mon application que je veux synchroniser pour le moment il n'y aurait que des insert et des delete.
du coup je vais tester je verrais bien ce que a donne en rel
1/ creation des donnes de hsql issue de mysql
2/travail dans l'appli en me basant sur hsql et en gnrant un fichier de transaction.
3/import des donnes en excutant le script gnr avec un contrle sur les insert de non existence des lignes pour viter les doublons si quelqu'un a fait la mme  saisie pendant qu'on ait hors connect.
Je penses que a devrait tre pas mal  tester pour voir les temps dexcutions.
je penses qu'il n'y a probablement pas d'autres solutions mais au cas ou je laisse le post ouvert encore un peu.
Merci







> Bonjour,
> 
> La synchronisation des donnes saisies hors connexion avec le serveur (en ligne) est assez delicate, ce d'autant plus que pendant le fonctionnement ton application en mode non connect, les donnes du serveur principal peuvent aussi tre mises  jour. Je n'ai pas encore eu cette problmatique mais j'aurais tendance  te proposer de mettre en place un batch de synchronisation, qui fonctionnera dans les 2 sens :
> 1- Dans le sens de Mysql vers Hsqld, c'est une simple crasement/remplacement de donnes
> 2- Dans le sens HsqlDb vers Mysql, il faudra retrouver les enregistrements en I/U/D ayant boug sur HsqlDB (voire de ton fichier temporaire de transaction), pour les "I/D" aucun souci, les insrer/supprimer dans mysql, mais pour les U, c'est l la situation tordue qui consistera  merger les lignes.
> Je suis dsol de ne pas avoir de solution automatique pour ton traitement, mais je reste galement ouvert  une autre solution.

----------


## merlin1977

Bonjour,
j'ai commenc  faire des tests import de table de mysql vers hsqlbd et l...
a fonctionne mais c'est titanesque  mettre en place et surtout a sera impossible  maintenir par la suite.(plein de vue et le nombre de table  crer et trop important pour que a soit une bonne solution)
Du coup plan B.
Je me dis que le mieux serait d'importer toute la base du serveur vers le poste local.
la base sur le serveur est mariadb j'ai vu en lignes quelques infos sur une version de mariadb qui pourrait tre install nativement dans l'application mais rien de bien clair : 
Est ce que quelqu'un aurait des infos  ce sujet? 
Est il possible de faire via le code java un import des donnes de la base en ligne puis un export de la bas mariadb vers la base qui elle serait local du moins si c'est possible.
(de ce que j'ai vu hsqlbd n'a pas la mme syntaxe et un import export ne marcherait pas.)
Merci pour votre aide.

----------


## freddou17

Slt,

Pourquoi n'utilises tu pas un orm par exemple hibernate en crant 2 sessionFactory avec respectivement une datasource (lecture) et une (ecriture). 
1) je rcupre mes objets  l'aide de la session hibernate de lecture (Mariadb)
2) je dtache les objets
3) je les rattache  ma session hibernate d'criture (hsql)
4) pour la syncronisation //c'est une ide
** une map<Integer, Integer> => map<idHsqldb, idMariaDb>  deleter
** de mme pour les insert...

un seul mapping pour 2 drivers de base et du coup tu peux utiliser les save, merge, load...

++

----------


## DevServlet

> Bonjour,
> j'ai commenc  faire des tests import de table de mysql vers hsqlbd et l...
> a fonctionne mais c'est titanesque  mettre en place et surtout a sera impossible  maintenir par la suite.(plein de vue et le nombre de table  crer et trop important pour que a soit une bonne solution)
> Du coup plan B.
> Je me dis que le mieux serait d'importer toute la base du serveur vers le poste local.
> la base sur le serveur est mariadb j'ai vu en lignes quelques infos sur une version de mariadb qui pourrait tre install nativement dans l'application mais rien de bien clair : 
> Est ce que quelqu'un aurait des infos  ce sujet? 
> Est il possible de faire via le code java un import des donnes de la base en ligne puis un export de la bas mariadb vers la base qui elle serait local du moins si c'est possible.
> (de ce que j'ai vu hsqlbd n'a pas la mme syntaxe et un import export ne marcherait pas.)
> Merci pour votre aide.


Bonjour,
puisque c'est le serveur mysql qui fait foi, tu peux te faire un petit batch que tu lances avant de te mettre hors connexion, ce script aura pour tche de faire un dump de ta base de donnes mysql, ensuite craser la version locale pour la remplacer. Ton application doit tre paramtr pour savoir quand elle tourne Hors Ligne(HL) et En Ligne(EL). Quand elle est EL, il faut activer un traage de tous les ordres SQL gnrs sur la base, lesquels seront rejous sur ta base de donnes EL.
Quite  toi de grer maintenant les confilts de modifications.
Bon courage

----------


## merlin1977

Merci  pour votre participation, 
je vais me pencher  sur le sujet hibernate, je ne connais pas du tout le sujet.
l'ide de faire un dump tait mon plan B mais le dump  de mysql n'est pas compatible avec hsqlbd (apparement il y a des syntaxes diffrentes) donc je pensais intgrer mariadb en local au lieu de hsqlbd mais je trouve peu d'info sur la mthode pour mettre mariadb en version intgr  l'application.Par ailleurs je me dit qu'une fois la base de donne en production faire un dump de toute la base pour 20 tables qui  mintressent et dont seul les dernires lignes de donne vont mintresser ce n'est peut tre pas la meilleurs ide....
Bref il faut que je creuse encore un peu... et que je regarde ce que permet hibernate  ::): 
Merci pour votre aide

----------

