Janky ha scritto in questo post che una delle novità della nuova beta di NHiberante 1.2.0 è il nuovo connection model. Qual è la differenza?
Piccola premessa: è (ed era) possibile fornire alla session una propria connessione, creata esternamente a NHibernate, quindi; in questo caso sarà sempre responsabilità dell'utente gestirne il ciclo di vita.
E nel caso (più comune) in cui lasciamo fare a NHibernate?
Prima di beta 3
La connessione veniva aperta alla prima occasione in cui si rendeva necessaria un'interazione con il DB e da quel momento restava aperta fino alla dispose della Session o ad una chiamata al suo metodo Close(). In questo caso, quindi, era consigliato utilizzare la session all'interno di un blocco using secondo il pattern
- Creo l'oggetto session
- get/update/save di un oggetto
- apporto le modifiche
- invoco il Flush() (o meglio il Commit() della transazione)
- invoco Session.Dispose()
Chi era presente al workshop di DotNetMarche, ha avuto modo di vedere che tutti gli esempi che io e Giancarlo abbiamo mostrato, seguivano bene o male questa sequenza.
Dalla beta 3
La connessione viene aperta alla prima occasione in cui è necessario e viene chiusa immediatamente dopo aver terminato l'esecuzione delle operazioni scheduled. Ovviamente non ci sono penalizzazioni a livello di performance grazie al connection pooling. Il vantaggio di questo approccio è che, a tutti gli effetti, ci permette di tenere in vita la Session per più tempo, senza per questo incorrere in inutili sprechi di risorse.