Cosa si vuole risolvere è la sincronizzazione di due modelli: Hai il modello in-memory e il modello di database. La semplice propagazione di ogni modifica nel database, come accade, è troppo costosa. Inoltre, si desidera essere in grado di gestire gli errori (ad esempio, ripristinare il modello in uno stato coerente). Per essere in grado di farlo, devi avere un modo per dire "ora, è coerente".
La soluzione corrente è avviare una transazione nel database quando il modello è noto per essere coerente (in genere prima di iniziare a fare le modifiche) e quindi eseguire tutte le modifiche nella modalità in memoria, mapparle in qualche modo sul database , aggiorna il database e quindi effettua il commit della transazione.
Mentre suona semplice, la programmazione OO interferisce attivamente. Nascondiamo le operazioni dei modelli in profondità nella struttura delle chiamate, proviamo davvero a fare in modo che gli utenti di un pezzo di codice non sappiano cosa fa effettivamente il codice. In un mondo perfetto, i tuoi strumenti di sviluppo dovrebbero srotolare tutto il codice necessario a un'operazione in un unico metodo/funzione, avvolgerlo in una transazione e completarlo.
Questo non funziona. Invece, abbiamo deciso di introdurre una variabile globale: la sessione. Il che è male, e ci vergogniamo, quindi cerchiamo di nascondere questo fatto, ma la sessione è globale - per operazione. Ora è necessario un modo per allegare la sessione all'operazione. Puoi dire "tutto il codice che viene eseguito nel thread corrente è un'operazione". Se lo fai, la soluzione naturale è rendere la sessione globale per thread.
Oppure hai qualche token. Quindi allegerai la sessione al token e la passerai in giro.
Ma il problema fondamentale è e sempre stato: come collegare una sessione a una singola operazione sul modello. Le parti difficili devono sapere quando inizia un'operazione, quando finisce e come gestire gli errori.
Per le applicazioni Web, l'utilizzo di una richiesta è il modo naturale per definire un'operazione: tutto ciò che accade durante una richiesta viene considerato un singolo passaggio.L'app in realtà non mantiene il modello in memoria; tutto viene dimenticato alla fine della richiesta e caricato nuovamente dal database quando arriva la richiesta successiva. Lento ma gestibile.
Le applicazioni desktop sono un tipo di bestia completamente diverso. Di solito tengono in memoria l'intero modello per tutto il tempo. Non persistiamo i cambiamenti a meno che l'utente non lo chieda (quando "salva" il suo lavoro) perché sarebbe troppo lento e, poiché non c'è nulla come una richiesta, non esiste un modo semplice e automatico per definire una "operazione" .
L'idea di associare un'operazione a un evento è buona. Solo nelle app desktop è possibile avere più thread che comunicano con gli eventi e ora è necessario un modo per contrassegnare tutti gli eventi come "appartengono all'operazione avviata con l'evento X ricevuto molto tempo fa". Gli eventi sono in genere piccole quantità immutabili di dati, quindi non è possibile allegare la sessione a loro. Ma hai bisogno di una sorta di gettone per segnare tutti gli eventi che appartengono insieme. Questo è il motivo per cui la maggior parte delle app desktop funziona con un server (che funziona di nuovo come un'applicazione web) e senza un grande modello in memoria o non usa un database ma salva il modello in un formato personalizzato (pensa Office).
Hai abbandonato la domanda? Per lo più, si. – Surya
<> – Tordek
Sono passati 3 anni e non hai ricevuto risposta appropriata. Neanche io. A volte ho la sensazione che anche i ragazzi di JBoss non sappiano come usare il loro prodotto. Io uso solo una sessione per evento. –