2017-04-12 33 views
1

我們可以使用SessionStateMode作爲SQLServer爲會話變量提供持久性存儲。爲什麼我們不需要應用程序變量的靈活性?是否因爲它們的大小應該非常小(對於所有用戶都是通用的)?如何在Web Farm環境中的服務器之間共享Asp.Net應用程序變量

如果我們想到.net Web Farm,我們可能需要使這些Application變量保持一致。 SessionStateMode是否也存儲應用程序變量?我看到一張表[ASPStateTempApplications],但它只有AppId,AppName列。

+0

你是什麼意思的應用程序變量?例如'Global.asax'中的公共靜態變量?或者像'Application [「Foo」] =「Bar」;'? – Alisson

+0

Application [「Foo」] =「Bar」的應用程序狀態變量 – anveshtummala

+1

我在兩臺服務器上安裝了Redis,並配置了具有故障轉移的複製。但是如果可以像你問的那樣使用它,它會比使用Redis更簡單,我想知道它是否可能。 +1 – Alisson

回答

0

@Alisson

這是一個很好的閱讀

申請國家考慮 當使用應用程序的狀態,你必須注意以下重要因素:

資源: 因爲它是存儲在內存中,與將數據保存到磁盤或數據庫相比,應用程序狀態非常快。但是,將大塊數據存儲在應用程序狀態中可能會填滿服務器內存,從而導致服務器將內存分頁到磁盤。作爲使用應用程序狀態的替代方法,您可以使用ASP.NET緩存機制來存儲大量的應用程序數據。 ASP.NET緩存也將數據存儲在內存中,因此速度非常快;但是,ASP.NET主動管理緩存並在內存不足時刪除項目。有關更多信息,請參閱ASP.NET緩存概述。

波動性:由於應用程序狀態存儲在服務器內存中,因此每當應用程序停止或重新啓動時它都會丟失。例如,如果Web.config文件發生更改,應用程序將重新啓動,並且除非應用程序狀態值已寫入非易失性存儲介質(如數據庫),否則所有應用程序狀態都將丟失。

可擴展性:應用程序狀態不是服務於同一個應用程序多臺服務器之間共享,爲Web場中,或服務於同一臺服務器上相同的應用程序,如Web園多個工作進程之中。因此,您的應用程序不能依賴包含不同服務器或進程中應用程序狀態相同數據的應用程序狀態。 如果您的應用程序將在多處理器或多服務器環境中運行,請考慮使用更具可擴展性的選項(例如數據庫)來處理必須保持應用程序整個應用程序保真度的數據

併發性:應用程序狀態是自由線程的,這意味着應用程序狀態數據可以被多個線程同時訪問。因此,確保在更新應用程序狀態數據時,通過包含內置的同步支持以線程安全的方式執行此操作非常重要。您可以使用Lock和UnLock方法,通過鎖定數據一次只寫入一個源來確保數據的完整性。您還可以通過在Global.asax文件中的Application_Start方法中初始化應用程序狀態值來降低發生併發性問題的可能性。

相關問題