在一次request请求中,应该只有一个session,一方面是因为一个session只与数据库建立了一次连接,性能因素,还有一个原因就是Transaction问题,只有在同一个session中,用户的transaction才能回滚。
这个session从哪里来?sessionFactory.GetCurrentSession 从当前的session池中拿到属于当前方法上下文的session. 这里就涉及到了Session Context,即 session要存放在哪里。比如一般在ASP.NET MVC中,设置Session Context为web,就是说,以request为标准,session是存放在HttpContext中的。一个request的某个时候某个方法创建的session放到池中的时候,当在该request的生命周期中某个其他方法GetCurrentSession的时候,会去找标记在当前线程内的session返回来。当该request的生命周期结束后,存在HttpContext中的session也就销毁了。
getCurrentSession创建的session会绑定到当前线程,而openSession不会,但是可以通过 CurrentSessionContext.Bind(session)绑定到当前Context.
getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭session,也就是说,写代码的时候不用考虑session的关闭问题。而openSession必须手动关闭,必须手动的去做session关闭的控制。
ASP.NET中,如果我们希望每一个HTTP的请求只打开一个Session,在请求结束时关闭这个Session。也就是在请求期间,只用到这一个Session。或许我们可以称他为“one session per request”。这样做得好处是,你可以更容易地使用延迟加载,因为当领域模型传到表示层时,ISession在表示层仍然是打开的,并再请求结束后自动销毁。