Refer to
Every data access strategy after server-side cursors has had as a goal minimizing the length of time an application holds open a connection, and NHibernate is no different. Therefore, having a static Session sitting around open and available is a poor strategy.
Instead, you can use disconnected Sessions. You can still create a shared Session object (either instance-available or truly static) for use in your methods. However, instead of leaving it open, or closing it in every method, you can follow the following pattern:
public IList getClasses(){IList classes = null;try{ // session is declared in instance scope session.Reconnect(); ITransaction tx = session.BeginTransaction(); classes = session.CreateCriteria( typeof(UniversityClass)).List();}catch (Exception ex){ // handle exception}finally{ session.Flush(); session.Disconnect();}return classes;}