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,这样效率不是更好?!

(0)

相关推荐

  • Tomcat集群和Session复制应用介绍

    一个配置文件: 复制代码 代码如下: <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6"> <Manager className="org.apache.catalina.ha.session.BackupManager" expireSessionsOnShutdown="false"

  • PHP 使用MySQL管理Session的回调函数详解

    复制代码 代码如下: <?php class MySession extends DBSQL { /**   * __construct()   */  public function __construct() {   parent::__construct (); } /**   * open()   *    * @param <String> $sSavePath   * @param <String>$sSessionNames   *    * @return &

  • JavaWeb Session 会话管理实例详解

    Session会话简介 会话是指在一段时间内,用户使用同一个浏览器进程与Web应用之间的交互过程. 会话(Session)通常用来跟踪用户的状态,缓存用户在此浏览器进程中的信息. 当用户关闭浏览器,上一个Session也就无法再次获得了(Cookie的maxAge为-1的情况).再次打开新的浏览器,将开始一个新的会话. 类javax.servlet.http.HttpSession.每一个HttpSession代表用户的一个会话. 每一个Session的过期时间默认为30分钟. 当浏览器第一次访

  • Java中tomcat memecached session 共享同步问题的解决办法

    事件缘由:一个主项目"图说美物",另外一个子功能是品牌商的入驻功能,是跟主项目分开的项目,为了共享登录的用户信息,而实现session共享,俩个tomcat,一个tomcat6,一个tomcat7 web项目windows系统下实现session的共享 第一个步: 在俩个tomcat的context.xml这个文件中配置如下代码: <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManage

  • ASP.NET网站管理系统退出 清除浏览器缓存,Session的代码

    1.在系统登陆成功时记录登陆的用户名.密码等信息(登陆功能的部分代码) 复制代码 代码如下: Session["id"] = user.id.ToString(); Session["name"] = user.name.ToString(); Session["pwd"] = user.password.ToString(); Session["time"] = user.LoginTime.ToString(); Sess

  • asp.net页面状态管理cookie和服务器状态管理Session

    Cookie:是存储在客户端文件系统的文本文件中或客户端浏览器对话的客户端浏览器对话的内存中的少量的数据.当我们在访问一个网站网页,当用户请求该网页时,应用程序会首先检查用户在此前是否已经登录过,我们可以通过读取Cookie获取用户信息来判断是否让它继续访问 记录Cookie信息 创建一个名称是user的Cookie对象:HttpCookie cookie=new HttpCookie("user"); 给Cookie赋值,只能使用字符串赋值:cookie.Value="ch

  • Tomcat中session的管理机制

    详细描述Tomcat中session的管理机制: 1. 请求过程中的session操作: 简述:在请求过程中首先要解析请求中的sessionId信息,然后将sessionId存储到request的参数列表中.然后再从 request获取session的时候,如果存在sessionId那么就根据Id从session池中获取session,如果sessionId不 存在或者session失效,那么则新建session并且将session信息放入session池,供下次使用. (1)SessionId

  • PHP服务端SESSION管理工具提供下载

    文章作者:Inking信息来源:邪恶八进制信息安全团队(www.eviloctal.com) 前两天我所在的楼层断了网,郁闷的我什么也干不了.之前刚好看到剑心的blog里有篇疯狗写的关于利用session渗透的文章,文章写得很简单,到最后" 小气"的疯狗也没有把利用程序发出来,所以我不管有没有用先把它写下来了.由于不能查资料,所以只好对这手册看,代码在很多方面可能还存在着缺陷.最烦人的还是正则和文件流操作的问题,循环来循环去的,把我的头都搞晕了,光是调试都花了整整一天的时间(写代码粗心

  • Hibernate管理Session和批量操作分析

    本文详细分析了Hibernate管理Session和批量操作的用法.分享给大家供大家参考.具体分析如下: Hibernate管理Session Hibernate自身提供了三种管理Session对象的方法 ① Session对象的生命周期与本地线程绑定 ② Session对象的生命周期与JTA事务绑定 ③ Hibernate委托程序管理Session对象的生命周期 在Hibernate的配置文件中,hibernate.current_session_context_class属性用于指定Sess

  • 深入浅析TomCat Session管理分析

    前言 对于广大java开发者而已,对于J2EE规范中的Session应该并不陌生,我们可以使用Session管理用户的会话信息,最常见的就是拿Session用来存放用户登录.身份.权限及状态等信息.对于使用Tomcat作为Web容器的大部分开发人员而言,Tomcat是如何实现Session标记用户和管理Session信息的呢? 概要 SESSION Tomcat内部定义了Session和HttpSession这两个会话相关的接口,其类继承体系如图1所示. 图1 Session类继承体系 图1中额

随机推荐