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