Si desidera una strategia di gestione delle sessioni che consenta all'app di funzionare in modo efficace e sfruttare le funzionalità offerte da NHibernate, in particolare il caricamento nella cache e il caricamento lento.
Creazione di sessioni è un processo poco costoso e richiede poca RAM o CPU in anticipo, quindi non dovresti preoccuparti di conservare o riutilizzare le sessioni (in effetti, riutilizzarle può portare a un lato sgradevole e non previsto -Effetti). La factory di sessione è la cosa costosa e dovrebbe essere creata una sola volta all'avvio dell'app.
La regola generale è questa: la durata della sessione deve essere sufficientemente lunga da non avere oggetti persistenti in giro dopo l'interruzione della sessione.
Una volta che al termine della sessione, tutti i cambiamenti di monitoraggio per gli oggetti avete ottenuto dal quella sessione si ferma, quindi tali modifiche non vengono salvate a meno che deliberatamente ricollegare l'oggetto a una nuova sessione. La sessione dovrebbe quindi essere in giro fino a quando esisteranno gli oggetti che recupererai. In un'app Web, generalmente si intende una sessione per ogni richiesta; in WinForms, una sessione per ogni modulo.
Nel tuo caso, con un servizio di (presumo è in esecuzione come un servizio di Windows) facendo il lavoro NHibernate, si potrebbe prendere in considerazione che ha una sessione creata per ogni nuova richiesta da parte del consumo di un'applicazione desktop, e lo smaltimento è quando tale richiesta è stata revisionata. Non sapendo esattamente come funziona il tuo servizio e quale meccanismo l'app desktop usa per parlarci (remoting? WCF? Plain old SOAP?) Non posso davvero essere più specifico.
(Esistono alcune eccezioni a questa regola generale - si supponga di disporre di un set di oggetti persistenti che rappresentano una risorsa condivisa a cui altri codici si riferiscono ma non cambiano, è possibile caricare questi in primo piano all'avvio dell'app e lasciare da lì in poi.)
Se si riscontrano prestazioni lente in una tale strategia, è possibile che si stia parlando troppo con il database e che il grafico dell'oggetto sia complesso; guarda second-level caching in questo caso.
fonte
2010-01-06 15:00:53
Nella tua domanda http://stackoverflow.com/questions/2011950/nhibernate-mappings-issue-when-referencing-class-lazy-load-issue mi hai chiesto di esaminare questa nuova domanda, ma ti vedo " Ho già ricevuto un'ampia copertura. In secondo luogo, qui ho alcune opinioni, ma sappi che sembra che sessioni e transazioni siano mescolate nella discussione, mentre quelle sono cose diverse. Inoltre, un pool di sessioni o una sessione attivata dal timeout può essere utile in termini di prestazioni, ma difficile da configurare e ottenere correttamente. Si noti inoltre che sotto il cofano, il pool di connessioni viene utilizzato indipendentemente dal modello scelto. – Abel
Grazie per il tuo commento Abel. Negli esempi ho visto sessioni e transazioni spesso condividono la stessa durata, ma come visto nella domanda di riferimento questo può essere un problema a volte .. Spero che le persone abbiano risposto a "durata della sessione" - non "durata della transazione", l'impressione che sia così. – stiank81