最近使用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