Gestione delle dimensioni della sessione

6

Da quello che so, le informazioni sulla sessione vengono solitamente salvate sul server.
In Java i dati sono gestiti come una mappa che presumo contiene un identificatore di stringa e un riferimento a un oggetto che punta a una zona di memoria dal server.

Considerato questo, è sicuro assumere che l'archiviazione di un file Properties sulla sessione non avrà un effetto critico sulle prestazioni?

Devo gestire alcuni file delle proprietà della lingua ( ResourceBundle ). Per qualche ragione devo tradurre ad ogni richiesta almeno 30 stringhe in una delle 3 lingue. Ciò comporta molte clausole condizionali che possono essere evitate memorizzando il file Properties sulla sessione.

Nota: Il file Properties è solo un esempio. Lo scopo della domanda è determinare perché e come posizionare un oggetto Proprietà nella sessione differisce dal pacing di un oggetto String. Sono a conoscenza dell'aspetto delle dimensioni ma questo problema si presenta mentre tutti gli oggetti sono memorizzati sul server?

    
posta Ionut 10.02.2012 - 12:33
fonte

2 risposte

6

Non dovresti archiviarlo in sessione ma allo stesso tempo non dovresti caricare il file delle proprietà dopo ogni richiesta a causa dell'impatto negativo che l'I / O di file ripetuto potrebbe incorrere.

Memorizzalo su ApplicationContext che consente di caricare in memoria il file di una proprietà in una volta e può essere utilizzato a beneficio di tutti gli utenti su tutte le sessioni.

    
risposta data 10.02.2012 - 12:51
fonte
4

Non è necessario codificare nessun condizionale per ottenere la traduzione appropriata per una determinata proprietà, solo una Locale per l'utente corrente; fornisci quello quando recuperi un ResourceBundle :

ResourceBundle localeSpecificBundle = ResourceBundle.getBundle("bundleBaseName", userLocale);
String translated = localeSpecificBundle.getString("someKey");

Inoltre, ResourceBundle fa un po 'di cache attraverso la static < a href="http://docs.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html#getBundle%28java.lang.String,%20java.util.Locale,%20java.lang. ClassLoader,% 20java.util.ResourceBundle.Control% 29 "> getBundle metodo in modo che non ci si debba preoccupare di fare il proprio caching per evitare l'I / O dei file. Dal documento ResourceBundle:

Resource bundle instances created by the getBundle factory methods are cached by default, and the factory methods return the same resource bundle instance multiple times if it has been cached. getBundle clients may clear the cache, manage the lifetime of cached resource bundle instances using time-to-live values, or specify not to cache resource bundle instances.

La cache effettiva viene eseguita con una ConcurrentMap statica:

The cache is a map from cache keys (with bundle base name, locale, and class loader) to either a resource bundle or NONEXISTENT_BUNDLE wrapped by a BundleReference. The cache is a ConcurrentMap, allowing the cache to be searched concurrently by multiple threads. This will also allow the cache keys to be reclaimed along with the ClassLoaders they reference.

    
risposta data 10.02.2012 - 14:14
fonte

Leggi altre domande sui tag