溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ASP.NET 2.0中怎么在程序啟動(dòng)階段緩存數(shù)據(jù)

發(fā)布時(shí)間:2021-07-16 15:17:46 來源:億速云 閱讀:125 作者:Leah 欄目:開發(fā)技術(shù)

今天就跟大家聊聊有關(guān)ASP.NET 2.0中怎么在程序啟動(dòng)階段緩存數(shù)據(jù),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

第一步:在程序啟動(dòng)階段決定緩存哪些數(shù)據(jù)

  我們?cè)谇懊?章探討的reactive loading模式的示例適合處理這些數(shù)據(jù):周期性地改變且生成(generate)數(shù)據(jù)不需要太長(zhǎng)的時(shí)間。但是,如果緩存的數(shù)據(jù)從未改變,那么reactive loading模式使用的周期(expiry)就顯的有點(diǎn)多余。另外,如果需要緩存的數(shù)據(jù)要花很長(zhǎng)的時(shí)間才能生產(chǎn),當(dāng)用戶請(qǐng)求發(fā)現(xiàn)內(nèi)存為空時(shí),用戶將等很長(zhǎng)的時(shí)間來檢索并返回?cái)?shù)據(jù)。對(duì)此,可以考慮將靜態(tài)數(shù)據(jù)和需要很長(zhǎng)時(shí)間才能生成的數(shù)據(jù)在程序啟動(dòng)階段就緩存。

  雖然,數(shù)據(jù)庫(kù)有很多動(dòng)態(tài)的,經(jīng)常改變的值;不過靜態(tài)值也不少。舉例,數(shù)據(jù)庫(kù)表Patients有一個(gè)PrimaryLanguage列,其值可以為English, Spanish, French, Russian, Japanese等。不過我們不會(huì)直接在表Patients里存儲(chǔ)“English”或 “French”等字符串,而是在供查找的表Languages里存儲(chǔ)。如圖1:John Doe的primary language是English,而Ed Johnson的是Russian.

ASP.NET 2.0中怎么在程序啟動(dòng)階段緩存數(shù)據(jù)
圖1:表Languages為表Patients所使用的查找表

  在編輯或創(chuàng)建新patient的用戶界面里,將包含一個(gè)下拉列表框,列出表Languages里的所有語言項(xiàng)。不緩存的話,每次登錄該界面,系統(tǒng)都會(huì)查詢表Languages,這樣顯地和浪費(fèi)也沒有必要。因?yàn)楸鞮anguages不會(huì)頻繁的改變。

  我們可以用前面探討的reactive loading模式來對(duì)數(shù)據(jù)Languages進(jìn)行緩存。不過,reactive loading模式會(huì)使用基于時(shí)間的緩存周期(time-based expiry),這對(duì)靜態(tài)數(shù)據(jù)來說沒有必要。最好的辦法是在程序啟動(dòng)階段進(jìn)行預(yù)裝載。

  在本文,我們將探討如何緩存“查找表”(lookup table,例如Languages表對(duì)Patients表來說就是查找表)數(shù)據(jù)和其它的靜態(tài)信息。

第二步:考察緩存數(shù)據(jù)的不同途徑

  在一個(gè)ASP.NET應(yīng)用程序里,我們可以使用多種方法來緩存信息。在前面的教程我們看到的是data cache,其實(shí)通過使用static members(靜態(tài)成員)或application state(應(yīng)用程序狀態(tài))我們也可以將對(duì)象(objects)緩存。

當(dāng)處理一個(gè)類時(shí),我們?cè)谠L問其成員(members)前,應(yīng)先實(shí)例化。比如,為了調(diào)用BLL層里的一個(gè)方法,我們首先要?jiǎng)?chuàng)建該類的實(shí)例:

ProductsBLL productsAPI = new ProductsBLL();
productsAPI.SomeMethod();
productsAPI.SomeProperty = "Hello, World!";

  在調(diào)用SomeMethod或處理SomeProperty之前,我們必須首先用關(guān)鍵字new來創(chuàng)建一個(gè)類的實(shí)例。SomeMethod 和 SomeProperty要與一個(gè)具體的實(shí)例對(duì)應(yīng)起來,這些成員的生命周期(lifetime)取決與對(duì)應(yīng)對(duì)象的生命周期。另一方面,Static members,比如變量、屬性、方法等,對(duì)該類的所有實(shí)例來說都是共享的,因此其生命周期與該類的生命周期一樣長(zhǎng)。Static members要用關(guān)鍵字static來標(biāo)識(shí)。

  除了static members外,還可以使用application state。每一個(gè)ASP.NET應(yīng)用程序都包含一個(gè)name/value集,它對(duì)應(yīng)用程序的所有頁(yè)面和用戶都是共享的??梢酝ㄟ^HttpContext class類的Application property屬性來訪問它。在頁(yè)面的后臺(tái)代碼我們可以這樣訪問它:

Application["key"] = value;
object value = Application["key"];

  data cache提供了豐富的緩存數(shù)據(jù)的API(應(yīng)用程序接口),基于時(shí)間和從屬體的緩存周期(time- and dependency-based expiries)的機(jī)制,以及cache item priorities等。在本文,我們將看到3種緩存靜態(tài)數(shù)據(jù)的技術(shù)。

第三步:緩存Suppliers Table表的數(shù)據(jù)

  我們用到的Northwind數(shù)據(jù)庫(kù)并沒有“查找表”(lookup tables),DAL層用到的4個(gè)表的值也并非靜態(tài)的。沒必要花時(shí)間來向DAL層添加一個(gè)新數(shù)據(jù)庫(kù)表,再在BLL層添加新的類和新的方法,我們?cè)诒窘坛碳俣ū鞸uppliers的數(shù)據(jù)是靜態(tài)的,因此我們?cè)诔绦騿?dòng)是緩存其數(shù)據(jù)。

首先,我們?cè)贑L文件夾里創(chuàng)建一個(gè)名為StaticCache.cs的新類。

ASP.NET 2.0中怎么在程序啟動(dòng)階段緩存數(shù)據(jù)
圖2:在CL文件夾里創(chuàng)建StaticCache.cs類

我們需要添加一個(gè)在程序啟動(dòng)時(shí)裝載數(shù)據(jù)的方法;同樣,還有一個(gè)從內(nèi)存返回?cái)?shù)據(jù)的方法。

[System.ComponentModel.DataObject]
public class StaticCache
{
 private static Northwind.SuppliersDataTable suppliers = null;

 public static void LoadStaticCache()
 {
 // Get suppliers - cache using a static member variable
 SuppliersBLL suppliersBLL = new SuppliersBLL();
 suppliers = suppliersBLL.GetSuppliers();
 }
 [DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
 public static Northwind.SuppliersDataTable GetSuppliers()
 {
 return suppliers;
 }
}

  在上述代碼里,我們?cè)贚oadStaticCache()方法里,用一個(gè)static member變量suppliers來保存SuppliersBLL類的GetSuppliers()方法返回的結(jié)果。該LoadStaticCache()方法應(yīng)該在程序啟動(dòng)階段就被調(diào)用。一旦數(shù)據(jù)在啟動(dòng)時(shí)就被加載到內(nèi)存,任何要用到supplier信息的頁(yè)面都可以調(diào)用StaticCache class類的GetSuppliers()方法。因此,訪問數(shù)據(jù)庫(kù)獲取suppliers信息的情況只會(huì)發(fā)生一次,就是在啟動(dòng)階段。

  除了static member變量外,我們還可以使用application state 或data cache。下面的代碼將類進(jìn)行修改,它使用application state:

[System.ComponentModel.DataObject]
public class StaticCache
{
 public static void LoadStaticCache()
 {
 // Get suppliers - cache using application state
 SuppliersBLL suppliersBLL = new SuppliersBLL();
 HttpContext.Current.Application["key"] = suppliersBLL.GetSuppliers();
 }

 [DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
 public static Northwind.SuppliersDataTable GetSuppliers()
 {
 return HttpContext.Current.Application["key"] as Northwind.SuppliersDataTable;
 }
}

  在LoadStaticCache()方法里,supplier信息是存儲(chǔ)在application變量key里。在GetSuppliers()方法里,它作為Northwind.SuppliersDataTable類型返回。由于我們可以在ASP.NET頁(yè)面的后臺(tái)代碼里使用Application["key"]來訪問application state,所以,在這里我們必須使用HttpContext.Current.Application["key"]來獲取當(dāng)前的HttpContext。

同樣,我們可以使用data cache,如下所示:

[System.ComponentModel.DataObject]
public class StaticCache
{
 public static void LoadStaticCache()
 {
 // Get suppliers - cache using the data cache
 SuppliersBLL suppliersBLL = new SuppliersBLL();
 HttpRuntime.Cache.Insert(
  /* key */  "key",
  /* value */  suppliers,
  /* dependencies */ null,
  /* absoluteExpiration */ Cache.NoAbsoluteExpiration,
  /* slidingExpiration */ Cache.NoSlidingExpiration,
  /* priority */  CacheItemPriority.NotRemovable,
  /* onRemoveCallback */ null);
 }

 [DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
 public static Northwind.SuppliersDataTable GetSuppliers()
 {
 return HttpRuntime.Cache["key"] as Northwind.SuppliersDataTable;
 }
}

  向data cache添加一個(gè)條目,且沒指定時(shí)間周期(no time-based expiry)為此,我們System.Web.Caching.Cache.NoAbsoluteExpiration 和 System.Web.Caching.Cache.NoSlidingExpiration值作為輸入?yún)?shù)之一。在上面的data cache的Insert()方法里,我們指定了緩存條目的優(yōu)先級(jí)(priority).優(yōu)先級(jí)用以指明當(dāng)內(nèi)存容量不足時(shí),哪些條目應(yīng)從內(nèi)存移除。在此,我們將優(yōu)先級(jí)設(shè)為不可移除(也就是對(duì)應(yīng)的null),這就確保了當(dāng)內(nèi)存不足時(shí)不會(huì)將其移除。

  注意:本文下載代碼里的StaticCache class類使用的是 static member變量技術(shù),關(guān)于application state 和 data cache技術(shù)的代碼可以在類文件(class file)里的注釋部分找到。

第四步:在程序啟動(dòng)是執(zhí)行代碼

  為了在程序啟動(dòng)時(shí)執(zhí)行代碼,我們需要?jiǎng)?chuàng)建一個(gè)名為Global.asax的文件。該文件包含了application、session和request級(jí)事件的事件處理器。在該文件里我們將添加在程序啟動(dòng)時(shí)要執(zhí)行的代碼。

  要在網(wǎng)站根目錄里添加Global.asax文件,在Visual Studio解決資源管理器里,右擊網(wǎng)站項(xiàng)目,選Add New Item,從Add New Item對(duì)話框里選擇Global應(yīng)用程序項(xiàng)目類型,然后點(diǎn)Add按鈕。

  注意:如果你的根目錄里已經(jīng)存在Global.asax文件,Global應(yīng)用程序項(xiàng)目類型就不會(huì)出現(xiàn)在Add New Item對(duì)話框里。

ASP.NET 2.0中怎么在程序啟動(dòng)階段緩存數(shù)據(jù) 
圖3:在根目錄添加Global.asax文件。

默認(rèn)的Global.asax文件里包括了5個(gè)方法,每個(gè)方法都有一個(gè)服務(wù)器端(server-side)<script>標(biāo)記:

Application_Start –當(dāng)程序啟動(dòng)時(shí)執(zhí)行

Application_End – 當(dāng)程序完結(jié)時(shí)執(zhí)行

Application_Error – 每當(dāng)程序發(fā)生未經(jīng)處理(unhandled)的異常時(shí)發(fā)生。

Session_Start – 當(dāng)創(chuàng)建一個(gè)session時(shí)執(zhí)行

Session_End – 當(dāng)session完結(jié)時(shí)或被移除時(shí)發(fā)生

Application_Start事件處理器在程序的生命周期(life cycle)里只發(fā)生一次。程序起始于一個(gè)ASP.NET資源(resource)首次被請(qǐng)求,持續(xù)運(yùn)行直到程序重新啟動(dòng)為止。關(guān)于程序生命周期的更多細(xì)節(jié)請(qǐng)參閱文章《ASP.NET Application Life Cycle Overview》http://msdn2.microsoft.com/en-us/library/ms178473.aspx

本文,我們只需要為Application_Start方法添加代碼,放心大膽的將其它方法刪除。在Application_Start里,僅僅調(diào)用StaticCacheclass類的LoadStaticCache()方法。這將裝載并緩存supplier信息:

<%@ Application Language="C#" %>
<script runat="server">
 void Application_Start(object sender, EventArgs e)
 {
 StaticCache.LoadStaticCache();
 }
</script>

  要做的就是這些!在程序開始時(shí),LoadStaticCache()方法會(huì)從BLL獲取supplier信息,再存儲(chǔ)進(jìn)一個(gè)static member變量(或是你在StaticCache class類里面用的其它一些cache store)。為驗(yàn)證起見,在Application_Start 方法里設(shè)置斷點(diǎn)(breakpoint)并執(zhí)行程序。另外,在并發(fā)請(qǐng)求(Subsequent requests)時(shí),不會(huì)執(zhí)行Application_Start方法。

ASP.NET 2.0中怎么在程序啟動(dòng)階段緩存數(shù)據(jù)
圖4:用Breakpoint來驗(yàn)證Application_Start事件處理器的執(zhí)行

  注意:如果你在首次調(diào)試時(shí)沒有遇到Application_Start breakpoint,那是因?yàn)槟愕某绦蛞呀?jīng)啟動(dòng)了??梢孕薷腉lobal.asax 或 Web.config文件來強(qiáng)迫程序重新啟動(dòng)。你僅僅在這些文件的末尾添加(或刪除)一個(gè)空白行來快速的重啟程序。

第五步:展示緩存數(shù)據(jù)

  現(xiàn)在,StaticCache class類在程序啟動(dòng)時(shí)將supplier相關(guān)的數(shù)據(jù)進(jìn)行了緩存。要在表現(xiàn)層使用這些數(shù)據(jù),我們可以在ASP.NET頁(yè)面的后臺(tái)代碼通過ObjectDataSource控件或編程調(diào)用StaticCache class類的GetSuppliers()方法。讓我們看看如何使用ObjectDataSource 和 GridView控件來展示緩存的supplier信息。

  首先,打開文件夾里的AtApplicationStartup.aspx頁(yè)面,在“設(shè)計(jì)”模式里從工具箱里拖一個(gè)GridView控件到頁(yè)面,設(shè)置其ID為Suppliers。然后,從其智能標(biāo)簽里選擇創(chuàng)建一個(gè)新的ObjectDataSource,名為SuppliersCachedDataSource,設(shè)置它使用StaticCache class類的GetSuppliers()方法。

ASP.NET 2.0中怎么在程序啟動(dòng)階段緩存數(shù)據(jù)
圖5:設(shè)置ObjectDataSource控件使用StaticCache Class類

ASP.NET 2.0中怎么在程序啟動(dòng)階段緩存數(shù)據(jù)
圖6:使用GetSuppliers()方法來獲取緩存的Supplier數(shù)據(jù)

  完成設(shè)置后,Visual Studio會(huì)自動(dòng)的為SuppliersDataTable里的每一個(gè)列添加一個(gè)BoundFields。因此,你的GridView 和 ObjectDataSource控件的聲明標(biāo)記看起來應(yīng)該像下面這樣:

<asp:GridView ID="Suppliers" runat="server" AutoGenerateColumns="False"
 DataKeyNames="SupplierID" DataSourceID="SuppliersCachedDataSource"
 EnableViewState="False">
 <Columns>
 <asp:BoundField DataField="SupplierID" HeaderText="SupplierID"
  InsertVisible="False" ReadOnly="True"
  SortExpression="SupplierID" />
 <asp:BoundField DataField="CompanyName" HeaderText="CompanyName"
  SortExpression="CompanyName" />
 <asp:BoundField DataField="Address" HeaderText="Address"
  SortExpression="Address" />
 <asp:BoundField DataField="City" HeaderText="City"
  SortExpression="City" />
 <asp:BoundField DataField="Country" HeaderText="Country"
  SortExpression="Country" />
 <asp:BoundField DataField="Phone" HeaderText="Phone"
  SortExpression="Phone" />
 </Columns>
</asp:GridView>

<asp:ObjectDataSource ID="SuppliersCachedDataSource" runat="server"
 OldValuesParameterFormatString="original_{0}"
 SelectMethod="GetSuppliers" TypeName="StaticCache" />

  圖7顯示的是在瀏覽器登錄該頁(yè)面的畫面。同樣都是用BLL層的SuppliersBLL class類來獲取數(shù)據(jù),不同的是我們用StaticCache class類在程序開始時(shí)將數(shù)據(jù)緩存并將其返回。你可以在StaticCache class類的GetSuppliers()方法里設(shè)置斷點(diǎn)來進(jìn)行驗(yàn)證。

ASP.NET 2.0中怎么在程序啟動(dòng)階段緩存數(shù)據(jù)

看完上述內(nèi)容,你們對(duì)ASP.NET 2.0中怎么在程序啟動(dòng)階段緩存數(shù)據(jù)有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI