Asp.net 中session儲存的三種模式的具體運用(轉)__儲存

來源:互聯網
上載者:User

在Asp.net中Session的儲存方式不象asp那樣單一,一共提供了三種儲存方式,由於最近一個2000多人使用的web軟體出現了故障,使用者每天早上在某一時刻出現難以登陸現象,接著Session丟值出現,只有重啟IIS,或機器.這時程式恢複正常了.整天都不會出現同樣的問題,但是第二天依舊!這種現象持續了好幾天,我檢查了一下記錄檔,高峰每秒訪問人數大概20人左右,同時大概100多人線上,以後訪問人數還會增加,為瞭解決這個怪問題,先從軟體著手,故而三種方式都應用了一番。

開啟web.config檔案
    <sessionState
            mode="InProc"
            stateConnectionString="tcpip=127.0.0.1:42424"
            sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
            cookieless="false"
            timeout="20"
    />
其中預設的mode是InProc類型,這種模式和以前ASP模式一樣,就是伺服器將Session資訊儲存在IIS進程當中,當IIS關閉、重起後這些進程資訊都會丟失,但這種模式的效能最高(具體沒測,看書上說),這種模式是ASP.NET的預設。
        由於這種模式出現了故障,當時我的考慮就是由於訪問量過大的原因,導致Inetinfo.exe進程崩潰。使用者難以登陸以致Session丟值出現故障,我採用了另外一種Session的儲存方式把Session資訊儲存在進程外。
      首先,開啟管理工具找到服務,找到名為:ASP.NET State Service的服務,啟動它.並且改成自動啟動。這時你可以在工作管理員中看到一個名為aspnet_state.exe的進程。這就是我們儲存session資訊的進程。
     然後,回到web.config檔案中把Mode的值改為StateServer,儲存檔案。OK.

    <sessionState
            mode="StateServer"
            stateConnectionString="tcpip=127.0.0.1:42424"
            sqlConnectionString="data source=192.10.78.76;User id=sa;password=sa"
            cookieless="false"
            timeout="20"
    />
這種模式當我們重起IIS,儲存的session值不會丟失。另外這種方式還可以把資訊儲存在其他機器的進程中,不過還要更改 stateConnectionString="tcpip=127.0.0.1:42424",IP地址改為其他機器即可。

      另外還採取了其他的措施.比如把資料庫和Web伺服器分開,資料庫伺服器不提供WEB服務,Web伺服器不提供資料庫服務,
      然後把串連池擴大,由於ASP.NET中ADO.NET資料訪問預設串連池數量為100, 後來我擴大到6000順便把寫法加上來
“Server=(local);Database=rgs;password=sa;user ID=sa;Max Pool Size =6000; Min Pool Size =5;Pooling=True”

      最後把Machine.config中的ProcessModel中的memoryLimit改為95,預設為60,表示記憶體佔用超過60%後iis進程會自動重起。接著還做寫其它一些最佳化IIS的方法,把註冊表的IIS緩衝加大等等 。
      當我做完這些最佳化步驟後,整個軟體運行比較良好,第二天沒有發現堵塞的現象,但是第三天情況又出現了,實在沒辦法,我採取了最後一種方法就是將Session儲存在SQLServer中,我想這樣穩定性應該強些。
      要使用SQLServer中,首先在工作階段狀態的SQLServer的電腦上,運行InstallSqlState.sql或InstallPersistSqlState.sql(預設位置:systemroot/Microsoft.NET/Framework/versionNumber下面)兩個指令碼都建立一個名為ASPState的資料庫,兩個指令碼的差別在於放置ASPStateTempApplication和ASPStageTempSessions表的位置。InstallSqlState.sql指令碼將這些表添加到TempDB資料庫,該資料庫在電腦重起時將遺失資料,而InstallPersistSqlState.sql指令碼將這些表添加到ASPState資料庫,該資料庫重啟時保留會話資料。
      然後在應用程式的web.config檔案中,把<sessionState>元素的mode屬性設定為SQLServer,最後將sqlConnectionString屬性設定為Integrated Security=SSPI;data source=serverName;


<sessionState mode="SQLServer"
sqlConnectionString=" Integrated Security=SSPI;data source=dataserver;"
cookieless="false"
timeout="20"/>
</sessionState>

如果部署在其他機器上可以更改為,加上使用者名稱和密碼

    <sessionState
            mode="SQLServer"
            stateConnectionString="tcpip=127.0.0.1:42424"
            sqlConnectionString="data source=192.10.78.76;User id=sa;password=sa"
            cookieless="false"
            timeout="20"
    />
這樣部署完成了,如果不想使用這種可以刪除掉,只要在相應的目錄(systemroot/Microsoft.NET/Framework/versionNumber)找到UninstallPersistSqlState.sql或者UninstallSqlState.sql檔案運行即可。
       最後要注意的是,無論使用StateServer或者SQLServer模式時,當使用session轉換對象時,注意對象要先序列化,就是在類前加上Serializable,否則會出現錯誤!

當最後這種模式應用後,系統穩定了一段時間,目前還沒有異常出現,不過,隨著軟體使用者群的增加,這些天還在準備進一步的最佳化措施。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.