最近使用ExtJs4的mvc模式在开发了在线漫画的后台,由于异步请求比较多,有的回应时间长,有点短。我发如今屡次并发的状况下,会形成阻塞的状况。也就是说若是回应时间长的请求还在进行中,短的请求却被挂起。php
找了不少资料,最终肯定是asp.net session形成的。好像php也存在此类问题。session
现象:在一个网站中,当访问一个处理比较耗时的页面(A页面),页面请求尚未返回时,此时再点击访问该网站的其余页面(B页面)会出现B页面好久都没有响应和返回,直到A页面输出返回数据时才开始处理B页面的请求,形成请求排队处理,A页面阻塞了B页面的请求处理。并发
在一次的无心中我发现居然在A页面Loading(页面上加的提示)的时候,能够访问某个页面,真是惊喜,再试试几回,能够,确实能够,是否是页面代码阻塞了?因而查这两个页面的代码,其实这两个页面的代码就十几行,没什么问题呢。mvc
通过屡次尝试和比对,才发现这两个页都是无需登录验证的页面,以前出现阻塞的页面都是需登录验证后才可访问的页面,而系统的验证信息是存储在Session中,经过Session判断验证的。这时想到应该是Session的问题,但仍是不知如何处理,再去网上搜索,互联网上的信息真是应有尽有,终于搜索到问题所在:框架
/************************************************************/asp.net
问:为了能够顺序访问Session的状态值,Session是否提供了锁定机制?
答:Session实现了Reader/Writer的锁机制:
当页面对Session具备可写功能(即页面有<%@ Page EnableSessionState="True" %>标记),此时直到请求完成该页面的Session持有一个写锁定。
当页面对Session具备只读功能(即页面有<%@ Page EnableSessionState="ReadOnly" %>标记),此时知道请求完成该页面的Session持有一个读锁定。
读锁定将阻塞一个写锁定;读锁定不会阻塞读锁定;写锁定将阻塞全部的读写锁定。这就是为何两个框架中的同一个页面都去写同一个Session时,其中一个要等待另外一个(稍快的那个)完成后,才开始写。异步
“写锁定将阻塞全部的读写锁定”,也就是说页面在EnableSessionState="True"的状况下没返回输出时,一直持着Session写操做,其余页面对Session的读操做必须等待,而asp.net的aspx页面默认是EnableSessionState="True",每一个页面从请求开始至返回一直持着Session写操做,需验证页面必须读取Session值判断,这就是为何需验证的页面请求被阻塞的缘由。只要耗时页面(A页面)没有Session的写操做,也就不会阻塞其余页面的请求,因而修改A页面的EnableSessionState="ReadOnly",例如:<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TBS_Monitor_List.aspx.cs" EnableSessionState="ReadOnly" Inherits="TBS_Monitor_List" %> ,问题解决。网站
也就是说,在无需对session进行写操做的页面,加上EnableSessionState="ReadOnly" 属性,就不会形成Request阻塞的状况了。.net