Asp.Net中NHiernate的Session的管理

圆圆爱HOCC

圆圆爱HOCC

2016-02-19 16:09

每个人都希望每天都是开心的,不要因为一些琐事扰乱了心情还,闲暇的时间怎么打发,关注图老师可以让你学习更多的好东西,下面为大家推荐Asp.Net中NHiernate的Session的管理,赶紧看过来吧!
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管理,他使用的“session-per-request”这种模式。
  从字面上理解就是他为每个Request创建一个Session,直到这个请求销毁,那么这个Session也就Close了。
  而Cuyahoga他的做法和session-per-request有点不同地方就是,他为每个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);
     HttpContext.Current.Items.Add("CoreRepository", cr);
    }
   
    private void Context_EndRequest(object sender, EventArgs e)
    {
     // Close the NHibernate session.
     if (HttpContext.Current.Items["CoreRepository"] != null)
     {
      CoreRepository cr = (CoreRepository)HttpContext.Current.Items["CoreRepository"];
      cr.CloseSession();
     }
    }
   
  这样在每次请求的时候,会自动创建CoreRepository对象,当请求完毕后,就CloseSession(),在程序中通过HttpContext.Current.Items["CoreRepository"]就能获取CoreRepository对象了。
   
  这样也就变相的管理了NHibernate中的Session,也就达到了“session-per-request”的这种模式。
   
  详细的讲解: 通过实现IHttpModule初始化Nhibernate的Session
   
  这种方式比上面的那个每次操作都需要创建Session,性能和速度应该提高了不少,
  接着我就想,每个请求都创建Session,是不是我们可以象创建Connection Pool一样,也创建一个Session Pool,
  这样就每次请求的时候不是直接创建Session,而是在我们的Session Pool中拿已经创建好的Session,这样效率不是更好?!
  http://maplye.cnblogs.com/archive/2006/06/26/435683.html
展开更多 50%)
分享

猜你喜欢

Asp.Net中NHiernate的Session的管理

Web开发
Asp.Net中NHiernate的Session的管理

ASP和ASP.Net共享Session解决办法

Web开发
ASP和ASP.Net共享Session解决办法

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

关于ASP.Net中的时间处理

ASP
关于ASP.Net中的时间处理

asp.NET特写

电脑网络
asp.NET特写

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

ASP.Net中的MD5加密

Web开发
ASP.Net中的MD5加密

在ASP.Net中实现RSA加密

ASP
在ASP.Net中实现RSA加密

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Word2010公式功能帮你轻松设计公式

Word2010公式功能帮你轻松设计公式

在Linux高负载下mysql数据库彻底优化

在Linux高负载下mysql数据库彻底优化
下拉加载更多内容 ↓