当前位置:编程学习 > 网站相关 >>

NHibernate中的Session Context问题

在一次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关闭的控制。
getCurrentSession目前处理Transaction的方式是,transaction没有提交之前,获取的都是当前的session,当transaction提交之后,再使用getCurrentSession,获取的是一个新的session.sessionFactory.getCurrentSession()可以完成一系列的工作,当调用时,hibernate将session绑定到当前线程,事务结束后,hibernate将session从当前线程中释放,并且关闭session。当再次调用getCurrentSession()时,将得到一个新的session,并重新开始这一系列工作。不需要close session
 
 
 
在ASP.NET中,如果我们希望每一个HTTP的请求只打开一个Session,在请求结束时关闭这个Session。也就是在请求期间,只用到这一个Session。或许我们可以称他为“one session per request”。这样做得好处是,你可以更容易地使用延迟加载,因为当领域模型传到表示层时,ISession在表示层仍然是打开的,并再请求结束后自动销毁。
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,