Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [JAVA] MVC. Sincronizzare il model coi dati del db

    Un saluto a tutti.
    Sto studiando il pattern MVC e Observer e vorrei sapere se è possibile sincronizzare il model con i dati del
    database in maniera da informare le View che i dati nel db sono cambiati.

    Mi spiego. Attualmente ho un database con varie tabelle che vengono aggiornate da diversi programmi
    in Visual Basic sparsi su alcuni pc. Quindi, ognuno di questi programmi, scrive sul db e, a tempo, fa delle
    query per aggiornare le proprie View con i dati più recenti.
    Vorrei migrare a Java ed implementare il pattern MVC e Observer ma vorrei alcuni consigli ed informazioni.

    La classe Model dovrebbe avere i metodi per interagire col db. E fin qui è chiaro.
    Ma come fa il Model a sapere se qualche dato nel db è stato cambiato da un altra applicazione?
    La prima cosa che mi viene in mente è quella che il Model ha una copia degli ultimi dati del db e, a tempo,
    rilegge il db e lo confronta con i dati che ha per vedere se ci sono variazioni. In caso positivo, le View
    verrebbero notificate e leggerebbero i dati direttamente dal Model e non dal db, limitando così gli accessi.
    Ci sono altre soluzioni a riguardo?

    Se il programma fosse uno solo, nel momento in cui un metodo del Model scrive nel db, saprei anche che
    qualcosa è cambiato. Ma con diverse applicazioni ci dovrebbe essere un unico Model 'centralizzato' che scrive nel db
    in maniera che dovrebbe essere lui stesso ad avere la situazione aggiornata. Ed in questo caso mi viene
    in mente un'altra soluzione. Utilizzare RMI. Una applicazione server che fa da Model e gli altri client utilizzano
    il metodo del server per aggiornare il db. Ma poi come fa il server ad informare i client di aggiornarsi?
    L'RMI non l'ho ancora studiato e non mi sembra il momento visto che sono ancora agli inizi.

    Non ho trovato nulla in rete. Qualche consiglio, link o altro ?

    Grazie

  2. #2
    Che genere di client ci sono nel progetto? browser? o applicazione java?

  3. #3
    secondo me è inutile e dispendioso reinventarsi un meccanismo di caching proprietario; parti da uno esistente come, per esempio, http://jakarta.apache.org/jcs/
    Ivan Venuti
    Vuoi scaricare alcuni articoli sulla programmazione, pubblicati su riviste di informatica? Visita http://ivenuti.altervista.org/articoli.htm. Se vuoi imparare JavaScript leggi il mio libro: http://www.fag.it/scheda.aspx?ID=21754 !

  4. #4
    Innanzitutto grazie per aver risposto.
    Che genere di client ci sono nel progetto? browser? o applicazione java?
    Attualmente sono applicativi in Visual Basic. Vorrei passare a Java ma sempre applicazioni stand alone
    indipendenti. Ognuno di questi programmi dovrebbe avere il proprio Model che si accorge dei
    cambiamenti nel db.


    secondo me è inutile e dispendioso reinventarsi un meccanismo di caching proprietario; parti da uno esistente come, per esempio, http://jakarta.apache.org/jcs/
    Hai perfettamente ragione. Ma Jakarta è per applicazioni client-server, vero? O c'è qualcosa di simile
    per applicazioni in locale

  5. #5
    Allora in linea di massima puoi procedere con il pattern observer,trovi un esempio sul mio blog:

    http://programmaremobile.blogspot.co..._14.html#links

    I client saranno i listener che verranno notificati dall'elemento che controlla i cambiamente sul db.
    Quindi i client implementeranno l'interfaccia per l'update al fine di aggiornare la view.


    Il problema è realizzare in modo elegante quel componente software che verifica se avvengono dei cambiamenti sul db.

    A tal proposito che genere di cambiamenti avvengono? solo insert? o anche update e delete?

    Dammi altre indicazioni e dimmi se hai capito il concetto di observer in modo tale da continuare a modellare la soluzione

  6. #6
    Ok, entriamo nel dettaglio e semplifico la situazione che ho al lavoro per focalizzare meglio il concetto.
    Ho un database MySQL su un pc con 2 tabelle Strumentazione1 e Strumentazione2 composte dai seguenti campi.
    codice:
    Strumentazione1
    ORA   TEMPERATURA   PRESSIONE   LIVELLO
    Strumentazione2
    ORA   PESO   OSSIGENO   ARGON
    Ci sono 2 applicazioni (A e B) in 2 pc differenti.
    Il programma A si occupa di prelevare dati da fonti diverse (PLC, COM ecc) e ad
    intervalli di tempo o ad eventi fa un'INSERT nella tabella Strumentazione1.
    Il programma B preleva altri dati da altre fonti e li scrive in Strumentazione2.
    Entrambe le applicazioni hanno un form che mostrano i dati di entrambe le tabelle in modo da visualizzare
    l'ultima situazione.

    Attualmente, ognuna di queste applicazioni, ogni x secondi legge le 2 tabelle e visualizza i dati più recenti.
    Quello che vorrei creare è questo:
    I Model delle applicazioni A e B siano costantemente informati dei cambiamenti delle tabelle e di conseguenza
    notificare la propria View.
    Oppure, un'applicazione C, dotata di una classe Model, si occupa di avere la situazione più aggiornata delle 2 tabelle.
    Quando c'è un cambiamento in una delle tabelle, il Model aggiorna le sue proprietà e notifica le View dei 2
    programmi che leggeranno i dati dal Model e non dal db, riducendo così gli accessi.

    In entrambi i casi, vorrei creare un meccanismo in cui il Model sia sempre aggiornato col db.
    Il pattern MVC e Observer ho cominciato a studiarli e sono molto interessanti in quanto cambiano radicalmente
    il mio modo di concepire le applicazioni (provengo da programmazione procedurale )
    Spero di essere stato chiaro. Se così non fosse non esitare a chiedere

    Grazie

  7. #7
    Se vuoi limitare il numero di accessi al db puoi implementare il pattern observer in modo tale che quando vengono notificati gli observer gli passi i dati da aggiornare.

    Quindi il soggetto concreto del pattern deve continuamente controllare sul db se vengono fatti degli aggiornamenti.

    Nel caso di sole insert puoi mantenere un contatore del numero di entry sulla tabella, oppure puoi attivare il query.log di mysql e tenere sotto'occhio eventuali cambiamenti al db in modo da accorgerti anche su update delete.

  8. #8
    Scusa se ti rispondo ad intervalli lunghi, ma a lavoro non ho il collegamento internet.

    Se vuoi limitare il numero di accessi al db puoi implementare il pattern observer in modo tale che quando vengono notificati gli observer gli passi i dati da aggiornare.
    E' una buona soluzione. Dovro' studiare se implementare quello di java.util oppure farne uno ad hoc

    Quindi il soggetto concreto del pattern deve continuamente controllare sul db se vengono fatti degli aggiornamenti.
    Esatto. E' proprio questo il punto. Se il soggetto del pattern è istanziato su ogni programma, gli accessi si moltiplicano.
    Vorrei che il soggetto sia uno solo, magari su un pc, che notifichi agli altri programmi.

    oppure puoi attivare il query.log di mysql e tenere sotto'occhio eventuali cambiamenti al db in modo da accorgerti anche su update delete
    Interessante... In che modo controllo il query.log? Leggendo la dimensione del file se è variata? Ho notato che
    il file di log MySQL, una volta arrivato ad 1GB ne crea un altro.

    Avevo pensato ad meccanismo utilizzando i trigger :master:

  9. #9
    Ok visto che vuoi aggiornare view di programmi che risiedono in macchine diverse puoi optare per le seguenti soluzioni:

    utilizzare la tecnologia JMS (trovi un introduzione qui http://programmaremobile.blogspot.co..._14.html#links)

    In tale soluzione devi optare per un topic sul quale il model invia i dati da aggiornare (sottoforma di objectMessage) al topic, e tutte le view che hanno sottoscritto il topic riceveranno il messaggio. (Ovviamente spiegare in breve tale tecnologia è impossibile, ti dò l'idea!)

    La seconda soluzione potrebbe essere quella di far viaggiare attraverso le socket l'oggetto(es. anche List<> di oggetti che rappresentano i cambiamenti)
    Il model (l'unico!) invia sulle socket dei diversi programmi da notificare l'oggetto con i cambiamenti e le view avranno una serverSocket in ascolto in grado di recepire tali oggetti.

    Puoi rifarti in entrambi casi al pattern DTO (Data Transfer Object), dove tale oggetto implementa l'interfaccia serializzabile al fine di viaggiare attraverso la rete o tramite messaggio JMS.

    Riguardo il query log se esso viene cancellato o ruotato secondo un algoritmo noto (es. quando raggiunge 1GB) puoi prevedere il meccanismo e quindi aggirare il problema.

    Riguardo i trigger.. come fai a notificare da mysql le applicazioni attraverso i trigger?

  10. #10
    Riguardo i trigger.. come fai a notificare da mysql le applicazioni attraverso i trigger?
    Pensavo di creare una tabella separata (es. TEST) con un solo record ed un campo INTEGER per ogni tabella del db.
    Quando MySQL scrive o aggiorna in una tabella, scatena un trigger che incrementa il numero del campo
    relativo a quella tabella. In questo modo il Model può accedere solo alla tabella TEST per verificare se è
    incrementato il numero di un campo e di conseguenza leggerà solo la tabella interessata e notificherà
    gli altri. E' solo un'idea che mi è passata per la mente. Dovrò fare delle prove. Che dici?

    Per le altre soluzioni da te consigliate, ci do un'occhiata per vederne i meccanismi e ci studierò un pò.
    Ti ringrazio per la disponibilità, il tuo sito è già nei mio Segnalibri.

    Un saluto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.