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在表示层仍然是打开的,并再请求结束后自动销毁。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值