.Net基礎(chǔ):ASP.NET中的(de)session存(cún)儲模式運用
在asp.net中的Session存儲方式不象asp那樣(yàng)單一,一共提(tí)供了三種存儲方式,由於最近一個2000多人使用的web軟件出現了故障,用戶每(měi)天早上在某一時刻(kè)出現難以登陸現象,接著Session丟(diū)值出現,隻(zhī)有重啟IIS,或機器.這時程序恢複正常了.整(zhěng)天都不會出現同樣的問題 ,但是第二天依舊!這種(zhǒng)現象持續了(le)好幾天,我檢查了一下日誌文件,高峰每(měi)秒訪問人數大概20人左右,同時大概100多人在線,以後訪問(wèn)人數還會增加,為了(le)解決這個怪問題,先從軟件著手,故而三種方式都應用了一番。
打開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"
/>
其中默認的(de)mode是InProc類型,這種模式和以(yǐ)前ASP模式一樣,就是服務器將Session信息存儲在IIS進程當中,當IIS關閉、重起後這些進程(chéng)信息都會丟失,但這種模式的性能最高(具體沒測,看(kàn)書(shū)上說),這種模式是asp.net的默認方式。
由於這種模式(shì)出現了故障,當(dāng)時(shí)我的考慮就是由於訪問量過大(dà)的原因,導致Inetinfo.exe進程崩潰。用戶難以登陸以致Session丟值出現故障,我采(cǎi)用了另(lìng)外一種Session的存儲方(fāng)式把Session信息存儲在進程外。
首先,打開管理工具找到服務,找到名為:asp.net State Service的服務,啟動它.並且改成自動啟動。這時你可(kě)以在任(rèn)務管(guǎn)理器(qì)中看到一個(gè)名為aspnet_state.exe的進程。這就是我們保存session信息(xī)的(de)進程。
然後,回(huí)到web.config文件中把Mode的(de)值改為StateServer,保存文(wén)件。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"
/>
這種模式當我們重起(qǐ)IIS,保存的session值不會丟失。另外這種(zhǒng)方式還可以把信息保存在其他機器的進程(chéng)中,不過還要更改 stateConnectionString="tcpip=127.0.0.1:42424",IP地址改為其他機器即可。
另外還采取了其他的措施.比(bǐ)如把數據庫(kù)和Web服務器分(fèn)開,數(shù)據(jù)庫服(fú)務器不提供WEB服務,Web服務器不(bú)提供數據庫服務,
然後把連接池(chí)擴大,由於asp.net中ADO.NET數據訪問默認(rèn)連接池數量為100, 後來我(wǒ)擴大到6000順便把寫法加(jiā)上來
“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的方法,把注(zhù)冊表的IIS緩存加大等等 。
當(dāng)我做完這些優化步驟後,整個(gè)軟件運行比較良好,第二天沒有發現堵塞的現象,但是第三天情況(kuàng)又出現了,實在沒辦法,我采取了最後一種ASP.NET中的session存儲方法就是將Session存(cún)儲在SQLServer中(zhōng),我想這樣穩定性應該強些。
要使用SQLServer中,首先在會話狀(zhuàng)態的(de)SQLServer的計算機上,運行InstallSqlState.sql或InstallPersistSqlState.sql(默認位置:systemroot\Microsoft.NET\Framework\versionNumber下麵)兩個(gè)腳本都創建一個名為ASPState的數據庫,兩個腳本的差(chà)別在於放置ASPStateTempApplication和ASPStageTempSessions表的(de)位置。InstallSqlState.sql腳本將這些(xiē)表添加到(dào)TempDB數據庫,該數據庫(kù)在計算機重起時將丟(diū)失數據,而InstallPersistSqlState.sql腳本將這些表添加到ASPState數據庫(kù),該數據(jù)庫重啟時保留會話(huà)數據。
然後在應用程序的web.config文件(jiàn)中,把< sessionState>元素的mode屬性(xìng)設置(zhì)為SQLServer,最後將sqlConnectionString屬性設置為Integrated Security=SSPI;data source=serverName;
< sessionState mode="SQLServer" sqlConnectionString=" Integrated Security=SSPI;
data source=dataserver;"
cookieless="false"
timeout="20"/>
< /sessionState>
如果部(bù)署在其他(tā)機(jī)器上可以更改為,加上用戶名和密碼
< 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"
/>
這(zhè)樣部署完成(chéng)了,如果不想使用這種可以刪除掉,隻要在相應的目錄(systemroot\Microsoft.NET\Framework\versionNumber)找到(dào)UninstallPersistSqlState.sql或者UninstallSqlState.sql文件運行即可。這樣就介紹了ASP.NET中的session存儲模式。
最後要(yào)注意的(de)是,無論使用StateServer或者SQLServer模式時,當使用session轉(zhuǎn)換對象時,注意對象要先序列化,就是在(zài)類前加上Serializable,否(fǒu)則會出現錯誤!
關鍵詞:ASP.NET,session
閱讀本文後您有什麽(me)感(gǎn)想? 已有(yǒu) 人給出(chū)評價!
- 1
- 1
- 1
- 1
- 1
- 1