asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

Asp.Net中NHiernate的Session的管理


发布日期:2019年08月31日
 
Asp.Net中NHiernate的Session的管理
NHibernate中的Session在我的理解似乎就相当于数据库中连接因为它也有Open/Close的方法我没有研究NHibernate的源码不知道这种理解是否有误?我在网上搜了很多的关于Session的管理大多都是在我需要数据库操作的时候就OpenSession()操作完后就CloseSession()这有点拟似如我们刚开始学习ADONET的时候要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这样效率不是更好?!

               

上一篇:为ASP.NET控件添加设计时支持

下一篇:ASP.net(C#)批量上传图片