| 贵 州 学 习 网 |
|
session在繁忙站点上使用时有几个缺陷。繁忙的意思是:站点上每秒有上百的页面被请求,或者同时有上千的访问用户。这个技巧对于那些要求水平扩展强的站点非常重要,也就是指这些站点:它们利用多个服务器完成数据装载或者处理大量容错。对于小型站点,比如内部网intranet,session是非常值得提倡的。
再次重申,asp自动地为每一个首次点击web服务器的用户创建一个session,每一个session占有大约10kb的内存,生存期默认是20分钟。 使用session最大的问题不是性能,而是扩展性,session不能跨越多个web服务器,一旦在一个服务器上创建了session,它的数据就驻留在那里。这意味着,如果在web上使用session,你就得为每一个直接访问存放session服务器的用户请求设计一个策略。这就是将用户"粘"在web服务器上,术语"sticky sessions"就来源于此。如果web服务器遇到障碍,"stuck"用户就会丢失他们的session状态,因为session不保留在磁盘上。 再次重申,asp自动地为每一个首次点击web服务器的用户创建一个session,每一个session占有大约10kb的内存,生存期默认是20分钟。 使用session最大的问题不是性能,而是扩展性,session不能跨越多个web服务器,一旦在一个服务器上创建了session,它的数据就驻留在那里。这意味着,如果在web上使用session,你就得为每一个直接访问存放session服务器的用户请求设计一个策略。这就是将用户"粘"在web服务器上,术语"sticky sessions"就来源于此。如果web服务器遇到障碍,"stuck"用户就会丢失他们的session状态,因为session不保留在磁盘上。 许多对任务要求严格的站点都要设立至少2个web服务器,所以在设计严格任务的应用程序时,就需要执行"sticky sessions",或者简单地避免使用session,同时也可以采取其他保存用户状态到独立web服务器的管理技术。 如果不使用session,一定要确认将它们关闭,这可以通过internet服务管理器实现。如果决定使用session,可以通过几种方法来最小化它们的影响。 可以将不需要session的内容(比如帮助画面,访问者区域,等等)移动到关闭session的独立asp应用程序中。在基础页面上,可以给asp一个指示,让它不需要使用session。将下面的代码直接加入到asp页面的头部: <% @enablesessionstate=false %> 使用这个指示的一个很好的解释是在框架结构中session创建了一个有趣的问题。asp确保在一个时刻只有一个来自session的请求被执行,这就确保了如果浏览器为单个用户请求多个页面时,只有一个asp请求在那时能够接受session,如此就避免了存取session对象时的多线程问题。很不幸,在框架结构中的所有页面将按照连续的顺序显示出来,一个接一个,而不是同时,所以用户为了看到整个框架必须要等很长时间。规则是:如果一定的框架页面没有使用session,就一定要告诉asp直接使用@enablesessionstate=false。 除了使用session对象,还有许多其他管理会话状态的选择。对于小数量的状态(小于4kb),我们通常建议使用cookie、查询字符串变量以及表单隐藏域。对于象购物车一样的大数量数据,后台数据库是最合适的选择。 如果要编写很多vbscript或者jscript,为了提个性能,可以将代码编写成com对象并且编译使用。编译代码基本上比解释性代码运行快许多,编译组件对象可通过"early binding"存取其他com对象,这比在脚本中调用组件要有效。 这么做有许多优点: com对象有益于从商业规则中独立出表达式规则 com对象使代码重用变为可能 许多开发者发现用vb,c++或者visual j++编写程序,比asp更容易调试 com对象也有缺点,包括初始开发时间和对不同编程技巧的需要。注意将少量asp代码做成com对象组件不会有好处,反而可能导致性能的损失,从而失去了编译代码的优势。怎样组合使用asp脚本和com对象达到最佳性能是一个测试的问题。我们注意到微软公司已经大规模在windows 2000/IIS 5.0上提高了脚本与ado的性能,由此,随着iis5.0版本的引进,减少了编译代码的性能优势。 使用option explicit 要在asp文件中使用option explicit定义,并且放置到asp文件的头部,从而强迫开发者在使用前声明所有的变量。许多程序员都认为这在应用程序调试时非常有用,因为它避免了产生错误类型变量以及偶然创建新变量的可能。 也许更重要的是,声明的变量要大大快于非声明变量。 拷贝经常使用的数据到脚本变量中 在asp中存取com对象时,应该拷贝经常使用的对象数据到脚本变量中,这样就减少了对com对象的方法调用。这些调用要比存取脚本变量相对来说费时费力。当存取collection和dictionary对象时,使用这项技巧也减少了昂贵的查找操作。 通常,如果要不止一次地存取对象数据,就应将数据放入脚本变量中,对象数据主要也就是request变量(表单和查询字符串变量)。比如,站点要传递一个叫做userid的查询字符串变量,假设它将在一个特殊页面被引用12次,那么不需要调用request("userid")12次,只要在asp页面的头部分配给userid一个变量,然后在页面中使用它,这样做就节省了11次com方法的调用。 避免再定义数组 争取不要再定义数组。考虑到性能问题,如果机器的物理内存大小不够,最好按最差情况或者最佳情况设置数组的初始尺寸,需要时再重新定义。 在任何可能时使用server.transfer,而不要用response.redirect response.redirect告诉浏览器请求另一个不同的页面,这常常用于引导用户到登录页面或者出错处理页面。由于重定向强迫了一个新页面请求,结果是浏览器必须要与web服务器循环2次,并且web服务器必须处理一个额外的请求。iis5.0引进了一个新功能server.transfer,它执行在同一服务器上的页面传输,这将避免额外的浏览器-web服务器的数据循环,形成良好的系统性能,对于用户也有较好的响应时间。 |
责任编辑:gzu521