在發布或更新(xīn)網站進行測試時,往往會遇到一些小(xiǎo)問題,而往往這些小(xiǎo)問題也就反映了自己基礎的不紮實。在這裏給自己補補課。
今天更新(xīn)了一個網站,其中(zhōng)網站用(yòng)到了Application對象,裏面存了個Boolean值,是用(yòng)來判斷系統是否已經注冊的(在Global.asax中(zhōng)判斷是否已經注冊,然後更新(xīn)該值)。當把最新(xīn)的DLL文(wén)件覆蓋原有(yǒu)舊文(wén)件後,發現網站跳轉到注冊頁(yè)面。這就奇怪了,Application對象不是全局的,整個應用(yòng)程序生命周期中(zhōng)都存儲在内存中(zhōng)嗎? 趕緊查看了MSDN,原來沒考慮到Application對象的“易失性”。
參考MSDN原文(wén)(http://msdn.microsoft.com/zh-cn/library/ms178594.aspx)
使用(yòng)應用(yòng)程序狀态時,必須注意以下重要事項:
資源 由于應用(yòng)程序狀态存儲在内存中(zhōng),因此比将數據保存到磁盤或數據庫中(zhōng)速度更快。 但是,在應用(yòng)程序狀态中(zhōng)存儲較大的數據塊可(kě)能(néng)會耗盡服務(wù)器内存,這會導緻服務(wù)器将内存分(fēn)頁(yè)到磁盤。 除了使用(yòng)應用(yòng)程序狀态之外,還可(kě)以使用(yòng) ASP.NET 緩存機制來存儲大量的應用(yòng)程序數據。 ASP.NET 緩存也是将數據存儲在内存中(zhōng),因此速度很(hěn)快;但是,ASP.NET 會對緩存進行主動管理(lǐ),如果内存不足時将移除項。 有(yǒu)關更多(duō)信息,請參見 ASP.NET 緩存概述。
易失性 由于應用(yòng)程序狀态存儲在服務(wù)器内存中(zhōng),因此每當停止或重新(xīn)啓動應用(yòng)程序時應用(yòng)程序狀态都将丢失。 例如,如果更改了 Web.config 文(wén)件,則要重新(xīn)啓動應用(yòng)程序,此時除非将應用(yòng)程序狀态值寫入非易失性存儲媒體(tǐ)(如數據庫)中(zhōng),否則所有(yǒu)應用(yòng)程序狀态都将丢失。
可(kě)伸縮性 應用(yòng)程序狀态不能(néng)在為(wèi)同一應用(yòng)程序服務(wù)的多(duō)個服務(wù)器間(如在網絡場中(zhōng))共享,也不能(néng)在同一服務(wù)器上為(wèi)同一應用(yòng)程序服務(wù)的多(duō)個輔助進程間(如在網絡園中(zhōng))共享。 因此,應用(yòng)程序不能(néng)依靠應用(yòng)程序狀态來實現在不同的服務(wù)器或進程間包含相同的應用(yòng)程序狀态數據。 如果應用(yòng)程序要在多(duō)處理(lǐ)器或多(duō)服務(wù)器環境中(zhōng)運行,可(kě)以考慮對必須在應用(yòng)程序中(zhōng)準确保存的數據使用(yòng)伸縮性更強的選項(如數據庫)。
并發 應用(yòng)程序狀态采用(yòng)自由線(xiàn)程模式,即應用(yòng)程序狀态數據可(kě)由多(duō)個線(xiàn)程同時訪問。 因此,必須确保通過包含内置同步支持,以線(xiàn)程安(ān)全的方式進行應用(yòng)程序狀态數據更新(xīn)。 可(kě)以使用(yòng) Lock 和 UnLock 方法來确保數據的完整性,方法是鎖定數據,使其一次隻能(néng)由一個源進行寫操作(zuò)。 還可(kě)以初始化 Global.asax 文(wén)件中(zhōng) Application_Start 方法中(zhōng)的應用(yòng)程序狀态值,降低出現并發問題的可(kě)能(néng)性。