Memorizzazione di dati di grandi dimensioni nella sessione HTTP (applicazione Java)

4

Sto facendo questa domanda in continuazione con il link .

Sto pensando di seguire questo approccio.

  1. Quando l'utente aggiunge il prodotto al carrello, crea un modello di carrello, aggiungi elementi al carrello e salva in DB.
  2. Converti il modello del carrello in dati del carrello e lo salvi nella sessione HTTP.
  3. Qualsiasi aggiornamento / modifica aggiorna il carrello sottostante nel DB e aggiorna i dati snap shot in Session.
  4. Quando l'utente fa clic sulla vista della pagina del carrello, seleziona i dati del carrello da Sessione e visualizza il cliente.

Ho le seguenti domande riguardanti la sessione HTTP

  • Quanto è buono memorizzare grandi dati (Carrello) in Sessione?
  • Quanto può essere scalabile questo approccio? (Rispetto alla sessione)
  • La mia applicazione non andrà a mangiare e richiederà molta memoria?
  • Il mio approccio è corretto o devo prendere in considerazione altri punti durante la progettazione di questo?

Tuttavia, possiamo controllare quali devono essere memorizzati tutti i dati del carrello nella Sessione, ma dobbiamo comunque avere determinate informazioni nei dati del carrello che vengono archiviati in sessione?

    
posta Umesh Awasthi 17.10.2013 - 20:49
fonte

2 risposte

1

Presumo che tu stia facendo riferimento all'oggetto HttpSession e non a un oggetto bean Session J2EE.

Se hai un solo server, la Sessione è come una sorta di Mappa globale a cui puoi accedere ogni volta che l'utente fa una richiesta. Grandi oggetti o piccoli oggetti, in entrambi i casi, possono essere inseriti nella mappa, ma a seconda di quanto li lasci possono essere problematici.

La maggior parte dei server delle applicazioni rimuove le sessioni scadute, quindi se si prevede che i visitatori lascino il sito dopo un po ', allora forse non è necessario eseguire alcuna manutenzione della sessione e si può semplicemente lasciare scadere la sessione e il server delle applicazioni pulirà dopo di te.

Tuttavia, se si prevede che molti utenti rimarranno sul sito per un lungo periodo e potrebbero potenzialmente avere oggetti duraturi nelle loro sessioni, e non si dispone di memoria sufficiente per gestirli, allora è necessario qualche altro approccio.

L'approccio più semplice potrebbe consistere nell'usare una sorta di cache LRU. Ad esempio, potresti utilizzare commons LRUMap che ti consente di impostare una dimensione massima sulla mappa e rimuove gli elementi di cui non ha più bisogno. In questo modo, puoi avere una cache globale per i tuoi oggetti di grandi dimensioni, e se hai troppi utenti la cache semplicemente lascia cadere i dati. Le prestazioni soffrono se ci sono molti errori nella cache, ma almeno tutto funziona ancora correttamente.

Alla fine della giornata, se non hai abbastanza RAM per immagazzinare roba e sufficiente larghezza di banda del database per gestire le miss, la tua app andrà in crash a prescindere dai trucchi che usi.

Gli svantaggi dell'utilizzo di HttpSession:

  1. Se si dispone di più server, ciò complica il failover o il bilanciamento del carico.
  2. Le sessioni, se di lunga durata, possono essere una sorta di perdita di memoria, in cui i dati vengono memorizzati nella cache e non vengono mai letti o eliminati.
  3. Le sessioni non sono condivise per utente, quindi non sono utili come cache generiche.

Svantaggi a una mappa globale come cache:

  1. Devi pulire i dati da solo o utilizzare una libreria di terze parti che esegue la pulizia.
  2. Se si dispone di più server, gli utenti devono rimanere sullo stesso server per beneficiare della cache.
  3. Tuttavia, a differenza di Sessioni, se ci sono dati che possono essere condivisi per utente, è facile con una mappa globale.
risposta data 17.12.2013 - 22:15
fonte
0

Penso che lo schema generale provi a memorizzare le informazioni minime possibili in memoria, ma memorizzo solo i dati utili. Questo approccio renderebbe la tua applicazione scalabile.

Se vuoi davvero un'applicazione scalabile, dovresti crearla su un app server, come JBoss / Wildfly o qualsiasi altro Java EE Container.

Le considerazioni sulla progettazione in Java EE servono a mantenere i bean di sessione il più leggeri possibile.

    
risposta data 18.10.2013 - 18:39
fonte

Leggi altre domande sui tag