在發(fā)布或更新網(wǎng)站進(jìn)行測試時,往往會遇到一些小問題,而往往這些小問題也就反映了自己基礎(chǔ)的不扎實。在這里給自己補(bǔ)補(bǔ)課。
今天更新了一個網(wǎng)站,其中網(wǎng)站用到了Application對象,里面存了個Boolean值,是用來判斷系統(tǒng)是否已經(jīng)注冊的(在Global.asax中判斷是否已經(jīng)注冊,然后更新該值)。當(dāng)把最新的DLL文件覆蓋原有舊文件后,發(fā)現(xiàn)網(wǎng)站跳轉(zhuǎn)到注冊頁面。這就奇怪了,Application對象不是全局的,整個應(yīng)用程序生命周期中都存儲在內(nèi)存中嗎? 趕緊查看了MSDN,原來沒考慮到Application對象的“易失性”。
參考MSDN原文(http://msdn.microsoft.com/zh-cn/library/ms178594.aspx)
使用應(yīng)用程序狀態(tài)時,必須注意以下重要事項:
Resources Because it is stored in memory, application state is very fast compared to saving data to disk or a database." space="preserve">資源 由于應(yīng)用程序狀態(tài)存儲在內(nèi)存中,因此比將數(shù)據(jù)保存到磁盤或數(shù)據(jù)庫中速度更快。 但是,在應(yīng)用程序狀態(tài)中存儲較大的數(shù)據(jù)塊可能會耗盡服務(wù)器內(nèi)存,這會導(dǎo)致服務(wù)器將內(nèi)存分頁到磁盤。 除了使用應(yīng)用程序狀態(tài)之外,還可以使用 ASP.NET 緩存機(jī)制來存儲大量的應(yīng)用程序數(shù)據(jù)。 ASP.NET 緩存也是將數(shù)據(jù)存儲在內(nèi)存中,因此速度很快;但是,ASP.NET 會對緩存進(jìn)行主動管理,如果內(nèi)存不足時將移除項。 ASP.NET Caching Overview." space="preserve">有關(guān)更多信息,請參見 ASP.NET 緩存概述。
Volatility Because application state is stored in server memory, it is lost whenever the application is stopped or restarted." space="preserve">易失性 由于應(yīng)用程序狀態(tài)存儲在服務(wù)器內(nèi)存中,因此每當(dāng)停止或重新啟動應(yīng)用程序時應(yīng)用程序狀態(tài)都將丟失。 例如,如果更改了 Web.config 文件,則要重新啟動應(yīng)用程序,此時除非將應(yīng)用程序狀態(tài)值寫入非易失性存儲媒體(如數(shù)據(jù)庫)中,否則所有應(yīng)用程序狀態(tài)都將丟失。
Scalability Application state is not shared among multiple servers serving the same application, as in a Web farm, or among multiple worker processes serving the same application on the same server, as in a Web garden." space="preserve">可伸縮性 應(yīng)用程序狀態(tài)不能在為同一應(yīng)用程序服務(wù)的多個服務(wù)器間(如在網(wǎng)絡(luò)場中)共享,也不能在同一服務(wù)器上為同一應(yīng)用程序服務(wù)的多個輔助進(jìn)程間(如在網(wǎng)絡(luò)園中)共享。 因此,應(yīng)用程序不能依靠應(yīng)用程序狀態(tài)來實現(xiàn)在不同的服務(wù)器或進(jìn)程間包含相同的應(yīng)用程序狀態(tài)數(shù)據(jù)。 如果應(yīng)用程序要在多處理器或多服務(wù)器環(huán)境中運(yùn)行,可以考慮對必須在應(yīng)用程序中準(zhǔn)確保存的數(shù)據(jù)使用伸縮性更強(qiáng)的選項(如數(shù)據(jù)庫)。
Concurrency Application state is free-threaded, which means that application state data can be accessed simultaneously by many threads." space="preserve">并發(fā) 應(yīng)用程序狀態(tài)采用自由線程模式,即應(yīng)用程序狀態(tài)數(shù)據(jù)可由多個線程同時訪問。 因此,必須確保通過包含內(nèi)置同步支持,以線程安全的方式進(jìn)行應(yīng)用程序狀態(tài)數(shù)據(jù)更新。 Lock and UnLock methods to ensure data integrity by locking the data for writing by only one source at a time." space="preserve">可以使用 Lock 和 UnLock 方法來確保數(shù)據(jù)的完整性,方法是鎖定數(shù)據(jù),使其一次只能由一個源進(jìn)行寫操作。 Application_Start method in the Global.asax file." space="preserve">還可以初始化 Global.asax 文件中 Application_Start 方法中的應(yīng)用程序狀態(tài)值,降低出現(xiàn)并發(fā)問題的可能性。