Come conservare dati da condividere al prossimo accesso

di il
6 risposte

Come conservare dati da condividere al prossimo accesso

Ciao ragazzi il mio problema è questo.
Sto realizzando una applicazione desktop o stand alone scritta in java,che si connette a un db su un server remoto per poter caricare una serie di cose(Cioè l'utente accede effettuando un login e può condividere questi file sul database). Devo poter fare questo: in caso di mancanza di linea o impossibilità di connessione al server se ci cerca di caricare una sessione sul db l'applicazione deve segnalare che non è possibile e caricarla automaticamente al prossimo avvio del programma. Ora quello che carico sono una serie di file, come potrei organizzare la procedura?
Io avevo pensato di salvarmi in un file xml o qualcosa del genere i dati che mi servono per l'accesso(es dati di login) e una cartella con i file da caricare. In modo che al primo accesso viene letto questo file xml e caricati i file. Però questo non mi sembra molto corretto a livello di sicurezza perchè accedendo al file potrebbero essere letti i vari dati e in caso di eliminazione della cartella dal pc andrebbe perso tutto.
Sapete darmi consigli su eventuali soluzioni alternative?

6 Risposte

  • Re: Come conservare dati da condividere al prossimo accesso

    Un pò contorto quello che vuoi fare.., almeno io non credo di aver capito bene, che significa caricare dei file in un db? Popolare delle tabelle? quindi caricare record..

    per il resto ti bastano dei txt.

    sicurezza? Beh almeno il login lo rifarà immagino, fine problema sicurezza
  • Re: Come conservare dati da condividere al prossimo accesso

    Puoi anche utilizzare un'altro approccio piu' moderno, decisamente piu' figo, ma anche piu' sofisticato.

    Non e' per deboli di cuore

    E' quello che si chiama database replicato: esistono gia' DBMS che supportano questa funzionalita, devi solo spulciare la documentazione o cercare il DBMS piu' adatto.

    L'idea e' la seguente: tu usi sempre un DBMS LOCALE.

    Poi c'e' un processo che si occupa di allineare il DBMS locale con quello remoto: porta gli aggiornamento da LOCALE a REMOTO e viceversa, con scadenza di secondi/minuti, a seconda delle esigenze e del carico di lavoro.

    In questo modo la tua applicazione NON DEVE preoccuparsi se esiste una connessione verso il DBMS remoto: tu ragioni SEMPRE come se questa connessione esistesse.

    Il processo che allinea i due DBMS e' assolutamente generico: non ha nessuna necessita' di conoscere le necessita' specifiche dell'applicazione. Lui ragiona SOLO in termini di tabelle/record/... Questo vuol dire che una volta fatto, lo puoi riutilizzare N-mila volte.

    E fa curriculum!

    Realizzare tutto questo a mano non e' eccessivamente difficile, se ti accontenti di funzionalita' base.
    Attenzione: fare le cose per bene e' abbondantemente al di la delle competenze del programmatore medio.

    Il contesto di funzionamento piu' semplice ed ideale (ed implementabile a mano) e' il seguente:

    0) hai un solo DB REMOTO

    1) BANALE: hai UN SOLO CLIENT. In questo caso devi solo aggiornare il DB REMOTO con le modifiche fatte su quello LOCALE.
    Puoi fare tutto con un timestamp di ultima modifica su ogni record ed un timestamp dell'ultimo aggiornamento

    2) SEMPLICE: hai PIU' CLIENT (ogn;uno con un ID univoco) che lavorano SOLO suoi propri dati. Ogni tabella ha una colonna che identifica il client (mediante l'ID). E' una variante del CLIENT UNICO, in cui partizioni i dati mediante il client ID.

    3) MOLTO COMPLICATO: ogni client puo' lavorare su TUTTI i dati del DB. Per supportare questa confgurazione servono ottime conoscenze di programmazione, programmazione concorrente, teoria relazionale dei dati, strategie di aggiornamento, e non so quante altre cose ...
    Per questo DEVI NECESSARIAMENTE ricuperare un DBMS che supporta gia' nativamente questa funzionalita'.

    http://dev.mysql.com/doc/refman/5.7/en/replication-howto.html
    https://msdn.microsoft.com/en-us/library/ms151198.asp
    http://www.oracle.com/technetwork/database/features/data-integration/index.html

    e questo:

    http://www.symmetricds.org

    Ovviamente cose del tipo: ma se mi cancellano il DBMS locale che succede?

    E' un po' come dire: vado al lavoro con la mia macchina ma se me la fregano che faccio?

    Ti attacchi ...

    Insomma: data l'idea, cerca un po' e vedrai che troverai cose DECISAMENTE interessanti!
  • Re: Come conservare dati da condividere al prossimo accesso

    LucaM ha scritto:


    Un pò contorto quello che vuoi fare.., almeno io non credo di aver capito bene, che significa caricare dei file in un db? Popolare delle tabelle? quindi caricare record..

    per il resto ti bastano dei txt.

    sicurezza? Beh almeno il login lo rifarà immagino, fine problema sicurezza
    In pratica popolo le tabelle del db e carico dei file sul server allo stesso tempo.
    Quindi in caso di mancata connessione devo salvarmi entrambi(dati da scrivere e file) per poterli caricare automaticamente al prossimo accesso
  • Re: Come conservare dati da condividere al prossimo accesso

    migliorabile ha scritto:


    Puoi anche utilizzare un'altro approccio piu' moderno, decisamente piu' figo, ma anche piu' sofisticato.

    Non e' per deboli di cuore

    E' quello che si chiama database replicato: esistono gia' DBMS che supportano questa funzionalita, devi solo spulciare la documentazione o cercare il DBMS piu' adatto.

    L'idea e' la seguente: tu usi sempre un DBMS LOCALE.

    Poi c'e' un processo che si occupa di allineare il DBMS locale con quello remoto: porta gli aggiornamento da LOCALE a REMOTO e viceversa, con scadenza di secondi/minuti, a seconda delle esigenze e del carico di lavoro.

    In questo modo la tua applicazione NON DEVE preoccuparsi se esiste una connessione verso il DBMS remoto: tu ragioni SEMPRE come se questa connessione esistesse.

    Il processo che allinea i due DBMS e' assolutamente generico: non ha nessuna necessita' di conoscere le necessita' specifiche dell'applicazione. Lui ragiona SOLO in termini di tabelle/record/... Questo vuol dire che una volta fatto, lo puoi riutilizzare N-mila volte.

    E fa curriculum!

    Realizzare tutto questo a mano non e' eccessivamente difficile, se ti accontenti di funzionalita' base.
    Attenzione: fare le cose per bene e' abbondantemente al di la delle competenze del programmatore medio.

    Il contesto di funzionamento piu' semplice ed ideale (ed implementabile a mano) e' il seguente:

    0) hai un solo DB REMOTO

    1) BANALE: hai UN SOLO CLIENT. In questo caso devi solo aggiornare il DB REMOTO con le modifiche fatte su quello LOCALE.
    Puoi fare tutto con un timestamp di ultima modifica su ogni record ed un timestamp dell'ultimo aggiornamento

    2) SEMPLICE: hai PIU' CLIENT (ogn;uno con un ID univoco) che lavorano SOLO suoi propri dati. Ogni tabella ha una colonna che identifica il client (mediante l'ID). E' una variante del CLIENT UNICO, in cui partizioni i dati mediante il client ID.

    3) MOLTO COMPLICATO: ogni client puo' lavorare su TUTTI i dati del DB. Per supportare questa confgurazione servono ottime conoscenze di programmazione, programmazione concorrente, teoria relazionale dei dati, strategie di aggiornamento, e non so quante altre cose ...
    Per questo DEVI NECESSARIAMENTE ricuperare un DBMS che supporta gia' nativamente questa funzionalita'.

    http://dev.mysql.com/doc/refman/5.7/en/replication-howto.html
    https://msdn.microsoft.com/en-us/library/ms151198.asp
    http://www.oracle.com/technetwork/database/features/data-integration/index.html

    e questo:

    http://www.symmetricds.org

    Ovviamente cose del tipo: ma se mi cancellano il DBMS locale che succede?

    E' un po' come dire: vado al lavoro con la mia macchina ma se me la fregano che faccio?

    Ti attacchi ...

    Insomma: data l'idea, cerca un po' e vedrai che troverai cose DECISAMENTE interessanti!
    Grazie mille per questa soluzione e mi informerò meglio. Però cosi facendo trattandosi di un applicazione desktop che viene installata su vari pc dovrei installare ogni volta anche il db locale,quindi preferirei una soluzione più semplice sotto questo punto di vista.
  • Re: Come conservare dati da condividere al prossimo accesso

    Valuta anche di appoggiare i file su Dropbox, visto che hai l'applicativo su più pc. Sconsiglio Google drive, simile a dropbox, ma non sempre si aggiorna, e mai velocemente. Dropbox invece è uno spettacolo, e potresti anche pensare a qualcosa cross server, tipo quello che mi stavo studiando io e che mi aveva portato a scrivere questo thread https://www.iprogrammatori.it/forum-programmazione/programmatori/dropbox-project-infinite-affini-t27987.html
  • Re: Come conservare dati da condividere al prossimo accesso

    Vedo idee da chiarire
    1) non esistono RDBMS "magici" in grado di fare questa funzione, se ci rifereriamo ai termini generali. Nè possono esistere.
    2) se il problema è questo
    " un db su un server remoto per poter caricare una serie di cose(Cioè l'utente accede effettuando un login e può condividere questi file sul database)" allora la situazione è totalmente diversa, e c'entra poco se non nulla il database.
    Puoi operare (cosa che ti suggerisco) nella modalità più stateless possibile.
    Prepara un tuo archivio locale dei file, e mettici dentro una chiave quale ad esempio l'hash SHA1 del contenuto del file stesso (che serberai ovviamente anche sul server)
    In fase di upload remoto controllerai sul db del server se l'hash esiste già. Se c'è => upload fatto, elimini dalla coda di elaborazione il file in oggetto, passi al successivo ad esaurimento.
    Altrimenti aggiungi una riga sul db remoto, marchiando con l'hash o quello che vuoi, ed elimini dalla coda
    In questo modo puoi metterti al riparo da interruzioni di connessione e problemi di linea.
    Nel mondo "normale" farai anche una funzione remota (cioè eseguita dal server) che ricalcola l'hash del file caricato e lo comunica al client, che lo raffronterà con quello atteso prima di scrivere la riga nel database.
    In tal modo eventuali problemi dovuti a corruzione di trasferimento verranno intercettati.
    Per velocizzare usualmente si ritorna prima la dimensione del file, e poi l'hash. In tal modo se la dimensione è <> non è necessario controllare l'hash ovviamente diverso

    In generale più "ragioni" in termini stateless, più facilmente riuscirai ad operare con connessioni inaffidabili come quella in oggetto.
Devi accedere o registrarti per scrivere nel forum
6 risposte