NHibernate的Session实例管理

Coordinator
Jul 8, 2011 at 4:23 PM

NHibernate最终的核心就是Session.不但所有ORM的操作都依赖这个类,而且NHibernate的特性之一,懒加载的前提是Session没有关闭.因此,这就引发出对Session生命周期的管理.通过AR的源代码分析,我们可以看出AR有三种管理模式:
1.默认情况下每次都会创建一个新的Session实例
2.在开启事务的时候,返回同一个Session实例
3.在同一个SessionScope作用内,返回同一个Session实例
4.不同数据库的SessionScope暂属于实验阶段,暂未成熟.
其实这些都是从简单操作来考虑的.但是如果从整个应用系统的角度来考虑Session的管理,我们该如何做?AR为我们提供一个非常好的拓展,即WebSessionScope,即在每个HTTP请求的生命周期内,都将只会有一个Session实例,无论是开不开启事务或其它方式.当然这样会带来一个问题就是,数据库连接数的限制.SqlServer是100个连接数(如果我没记错),如果是这样,我们站点将只能允许100个并发数据库操作.事实上呢?大多情况下,即使即时开启,即时关闭,我们应用并发并不能上升,原因是什么呢?看看最终交给数据库执行的SQL脚本吧!所以一个请求一个Session实例,并不会成本影响并发瓶颈,而且当你Flush完之后,这个连接应该会被关闭(暂没得到验证).
下面的问题来了,我们cs架构下的应用,是不是可以考虑一个进程只有一个实例呢?,