NHibernate中的Session
在我的理解似乎就相当于数据库中连接
因为它也有Open/Close的方法
我没有研究NHibernate的源码
不知道这种理解是否有误?我在网上搜了很多的关于Session的管理
大多都是在我需要数据库操作的时候
就OpenSession()
操作完后就CloseSession()
这有点拟似如我们刚开始学习ADO
NET的时候
要Connection对象Open()
数据处理完后就Close()
但是这里就带来了一个弊端
因为Connection的频繁的开关是非常消耗系统资源的
我记得以前在制作一个数据的录入界面的时
因为这个录入的界面数据元素比较多
而且很多DropDownList需要在数据库中读取数据并绑定
这样在该页面的Page_Load中需要调用相应对象的方法一一从数据库中检索数据绑定DropDownList因为我们这些对象的方法都是使用独立的Connection都有自己的Connection的Open和Close所以导致这个页面一打开就需要等待好长的时间比较慢后来我们将这些需要绑定DropDownList的数据通过一个数据处理成一个DataSet并将DataSet中的DataTable与DropDownList绑定这样只需要一次的Connection的Open/Close页面快了好多
所以我觉得上述的Session的管理办法不是很妥当
后来我看了Cuyahoga开源项目中他的Session管理他使用的sessionperrequest这种模式
从字面上理解就是他为每个Request创建一个Session直到这个请求销毁那么这个Session也就Close了
而Cuyahoga他的做法和sessionperrequest有点不同地方就是他为每个Request都创建了一个CoreRepository对象CoreRepository是系统所需要的数据处理服务的类
他的做法是先创建了HttpModule(NHSessionModule)用来创建CoreRepository对象和销毁CoreRepository对象如下
private void Context_BeginRequest(object sender EventArgs e)
{
// Create the repository for Core objects and add it to the current HttpContext
CoreRepository cr = new CoreRepository(true);
HttpContextCurrentItemsAdd(CoreRepository cr);
}
private void Context_EndRequest(object sender EventArgs e)
{
// Close the NHibernate session
if (HttpContextCurrentItems[CoreRepository] != null)
{
CoreRepository cr = (CoreRepository)HttpContextCurrentItems[CoreRepository];
crCloseSession();
}
}
这样在每次请求的时候会自动创建CoreRepository对象当请求完毕后就CloseSession()在程序中通过HttpContextCurrentItems[CoreRepository]就能获取CoreRepository对象了
这样也就变相的管理了NHibernate中的Session也就达到了sessionperrequest的这种模式
详细的讲解 通过实现IHttpModule初始化Nhibernate的Session
这种方式比上面的那个每次操作都需要创建Session性能和速度应该提高了不少
接着我就想每个请求都创建Session是不是我们可以象创建Connection Pool一样也创建一个Session Pool
这样就每次请求的时候不是直接创建Session而是在我们的Session Pool中拿已经创建好的Session这样效率不是更好?!