小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

ASP.NET2.0_緩存

 thy 2009-03-30

1.頁面緩存:
     頁面輸出緩存用于緩存頁面呈現(xiàn)的所有內(nèi)容(當(dāng)在瀏覽器中選擇查看源碼能看的所有內(nèi)容)到內(nèi)存中.
注:頁面輸出緩存作用于整個(gè)頁面.

1.1部分頁面緩存通過只緩存頁面上的一個(gè)特定區(qū)域來解決這個(gè)問題.利用部分頁面緩存,可以對(duì)頁面的不同區(qū)域應(yīng)用
不同的緩存策略.

1.2當(dāng)一個(gè)頁面被緩存時(shí),被請(qǐng)求時(shí)的頁面內(nèi)容并不會(huì)每次都重新生成.每次請(qǐng)求一個(gè)頁面,對(duì)應(yīng)到頁面的.NET類也不會(huì)
執(zhí)行.對(duì)于每一個(gè)請(qǐng)求頁面的用戶,頁面呈現(xiàn)的內(nèi)容都會(huì)緩存.

((((((((((((((((((((((((((((((((((((((((((((((((
緩存的存放的位置:
頁面可在多個(gè)位置緩存.而默認(rèn)情況下,頁面可能緩存在瀏覽器,任意的代理服務(wù)器端以及Web服務(wù)器.
(注:當(dāng)代理服務(wù)器端或?yàn)g覽器緩存頁面時(shí),它們總是緩存整個(gè)頁面.)
也可以在OutputCache的Location屬性來設(shè)置緩存存放位置。Any,Client,DownStream,None,ServerAndClient.

))))))))))))))))))))))))))))))))))))))))))))))))


1.3緩存之基于自定義函數(shù)變化的輸出緩存
VaryByCustom可以給它指定一個(gè)自定義函數(shù)來決定何時(shí)生成不同的頁面緩存版本.
可以在Global.asax全局程序類文件中重寫GetVaryByCustomString()方法來創(chuàng)建自定義函數(shù).
即根據(jù)GetVaryByCustomString()方法返回的string生成相應(yīng)此string的頁面緩存版本.


1.4創(chuàng)建頁面輸出緩存文件依賴
即可以在一個(gè)緩存頁面和硬盤上的一個(gè)文件(或一組文件)之間創(chuàng)建一個(gè)依賴。當(dāng)文件修改時(shí)緩存頁面自動(dòng)失效
并重新在下次頁面請(qǐng)求時(shí)生成。

 

1.5使用編程方式設(shè)置輸出緩存過期
使用Response.RemoveOutputCacheItem()方法,只接受一個(gè)“虛擬絕對(duì)”路徑,即要用Page.ResoveUrl()方法來
轉(zhuǎn)換~符號(hào)為應(yīng)用程序的根路徑。


HttpResponse.RemoveOutputCacheItem(Page.ResolveUrl("~/實(shí)現(xiàn)使用編程方式設(shè)置頁面輸出緩存過    期/MovieList.aspx"));
        Response.Redirect(
"~/實(shí)現(xiàn)使用編程方式設(shè)置頁面輸出緩存過期/MovieList.aspx");

1.6若要?jiǎng)h除多個(gè)頁面,需要?jiǎng)?chuàng)建一個(gè)所謂的鍵依賴(Key dependency)。一個(gè)鍵依賴用于在緩存中的項(xiàng)目之間建立依賴。當(dāng)?shù)诙€(gè)項(xiàng)目移除時(shí),第一個(gè)項(xiàng)目也會(huì)被自動(dòng)移除。
先插入Cache.Insert("Movies", DateTime.Now);
        Response.AddCacheItemDependency("Movies");
再在另一個(gè)頁面
  Cache.Remove("Movies");
        Response.Redirect("~/實(shí)現(xiàn)使用編程方式設(shè)置頁面輸出緩存過期/MovieListKeyDependency.aspx"); 

 

 

*****************************************************************************************
    上面介紹的是頁面的全部緩存輸出
    下面介紹的是使用部分頁面緩存

*****************************************************************************************
2使用緩存后替換有兩種方式:
2.1聲明方式一定要使用Substitution控件
 Substitution 控件指定輸出緩存的網(wǎng)頁上不進(jìn)行緩存的部分。使用 Substitution 控件可以在輸出緩存的網(wǎng)頁上指定希望用動(dòng)態(tài)內(nèi)容 替換控件的部分。
 
  Substitution 控件將動(dòng)態(tài)內(nèi)容插入到緩存頁中。Substitution 控件不會(huì)呈現(xiàn)任何標(biāo)記。您需要將該控件綁定到頁上或父用戶控件上 的方法中。您要自行創(chuàng)建靜態(tài)方法,以返回要插入到頁中的任何信息。由 Substitution 控件調(diào)用的方法必須符合下面的標(biāo)準(zhǔn):

 此方法被定義為靜態(tài)方法(在 Visual Basic 中為共享方法)。

 此方法接受 HttpContext 類型的參數(shù)。

 此方法返回 String 類型的值。
 即此方法的簽名為:public static string MethodName(HttpContext context){}

 (注:Substitution的屬性MethodName返回的string可以支持Html編碼哦。)
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_aspnetcon/html/fd47d5f3-1ede-4096-96eb-8d9c96012451.htm


2.2.可用編程方式Response.WriteSubstitution()
  Substitution控件的時(shí)間是:
        <% Response.WriteSubstitution(GetTime);%>


2.3使用用戶控件緩存(緩存后替換只在處理字符串文本和HTML時(shí)比較合適,若望處理更復(fù)雜的部分頁面緩存,則應(yīng)該利用用戶控件)
<%@ Control Language="C#" ClassName="Movies" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>

用戶控件時(shí)間:<%= DateTime.Now.ToString("T") %><hr />
<asp:GridView ID="grdMovies" DataSourceID="srcMovies" runat="server" />
<asp:SqlDataSource ID="srcMovies" ConnectionString="<%$ ConnectionStrings:Movies %>" SelectCommand="SELECT Title,Director FROM Movies" runat="server" />
(注:用戶控件中的OutputCache有個(gè)Shared屬性,若設(shè)為true則此用戶在多個(gè)頁面中使用時(shí),都是只緩存一個(gè)頁面版本.)
用編程方式處理用戶控件緩存

Code

 


************************************************************************************
4.使用DataSource緩存(即可以設(shè)置DataSource屬性來實(shí)現(xiàn))
4.1
使用數(shù)據(jù)源控件緩存的一個(gè)好處是數(shù)據(jù)源控件可以在數(shù)據(jù)更新時(shí)自動(dòng)重新載入數(shù)據(jù),且可以在多個(gè)頁面間共享相同的數(shù)據(jù).


<asp:GridView ID="grdMovies" DataSourceID="srcMovies" runat="server" />
        
<asp:SqlDataSource ID="srcMovies" EnableCaching="true" CacheDuration="60" SelectCommand="SELECT * FROM Movies" ConnectionString="<%$ ConnectionStrings:Movies %>" runat="server" />

 

4.2使用Sliding緩存過期策略
需要緩存大量數(shù)據(jù),則使用sliding過期策略比絕對(duì)緩存過期策略要更合理.當(dāng)使用sliding緩存過期策略時(shí),除非數(shù)據(jù)在指定時(shí)間段內(nèi)
再次被請(qǐng)求訪問,否則緩存就會(huì)丟失.(也就是說用戶不停的訪問時(shí),其過期間隔還是這么多)


 <asp:GridView ID="grdMovies" DataSourceID="srcMovies" runat="server" />
        
<asp:SqlDataSource ID="srcMovies" EnableCaching="true" CacheExpirationPolicy="Sliding" CacheDuration="15" SelectCommand="SELECT * FROM Movies" ConnectionString="<%$ ConnectionStrings:Movies %>" runat="server" OnSelecting="srcMovies_Selecting" />

(小技巧:檢測(cè)電影的緩存是否失效可實(shí)現(xiàn)SqlDataSource數(shù)據(jù)源控件的Selecting事件,因此事件是在從數(shù)據(jù)庫獲得電影時(shí)被調(diào)用,若從內(nèi)存中獲得時(shí)不會(huì)被調(diào)用.)

4.3其實(shí)ObjectDataSource控件與SqlDataSource控件一樣的緩存屬性.

 

 

5.使用數(shù)據(jù)緩存
     在內(nèi)部,Asp.Net Framework包含的所有不同的緩存機(jī)制都使用了Cache對(duì)象.也就是說,Cache對(duì)象是Asp.Net中所有緩存的根本機(jī)制.
      對(duì)于每一個(gè)Asp.Net應(yīng)用程序,都會(huì)創(chuàng)建了個(gè)Cache對(duì)象的實(shí)例.添加到緩存中的任何項(xiàng)目都能被其他頁面,控件或包含在相同的應(yīng)用程序(虛擬目錄)中的組件訪問.

5.1使用緩存API
即Cache對(duì)象,其有屬性及相應(yīng)的方法。

 

6.使用SQL緩存依賴(就象trigger一樣,數(shù)據(jù)庫一更新就把緩存給更新)
     ASP.NET2.0 Framework新增的一個(gè)非常強(qiáng)大的功能是SQL緩存依賴.該功能允許在指定的數(shù)據(jù)庫數(shù)據(jù)修改時(shí),自動(dòng)地重新載入緩存的數(shù)據(jù).
     ASP.NET Framework支持的SQL緩存依賴使得使用緩存時(shí)可以充分利用緩存,并陳舊數(shù)據(jù)最少.當(dāng)使用SQL緩存依賴時(shí),可以自動(dòng)監(jiān)測(cè)指定數(shù)據(jù)庫中的數(shù)據(jù)是否變更,并刷新緩存中的數(shù)據(jù).

6.1使用拉SQL緩存依賴
     拉SQL緩存依賴是最靈活的SQL緩存依賴類型,所以對(duì)大多數(shù)應(yīng)用程序來說,推薦使用拉類型SQL緩存依賴可以使用拉SQL緩存依賴來檢測(cè)數(shù)據(jù)庫表的修改.

     拉SQL緩存依賴就是:使用數(shù)據(jù)庫trigger.當(dāng)表被修改時(shí),trigger被觸發(fā),名為AspNet_SqlCacheTablesForChangeNotification的數(shù)據(jù)表的一行數(shù)據(jù)將被更新,來記錄被修改的情況.

     具體內(nèi)部運(yùn)行是:ASP.MET Framework使用一個(gè)后臺(tái)線程,來定期拉數(shù)據(jù)庫表的修改信息.如果有修改,則依賴于數(shù)據(jù)表的緩存項(xiàng)目從緩存中移除.

6.2配置拉SQL緩存依賴
     在使用拉SQL緩存依賴之前,必須執(zhí)行下面兩步驟:
1).必須對(duì)一個(gè)或多個(gè)數(shù)據(jù)庫表啟用SQL緩存依賴.
 6.2.1.1執(zhí)行下面的命令可啟用test數(shù)據(jù)庫的SQL緩存依賴:
 aspnet_regsql -C "Data Source=localhost;Integrated Security=True;Initial Catalog=test" -ed
 或
 aspnet_regsql -C "Server=.;Integrated Security=True;Database=pubs" -ed
  (此命令將創(chuàng)建AspNet_SqlCacheTablesForChangeNotification數(shù)據(jù)表,并添加一組存儲(chǔ)過程到鏈接字符串指定的數(shù)據(jù)庫)

 6.2.1.2啟用一個(gè)數(shù)據(jù)庫之后,就可以用如下命令啟用特定表的SQL緩存依賴:(啟用tbTest數(shù)據(jù)表的SQL緩存依賴)
 aspnet_regsql -C "Data Source=localhost;Integrated Security=True;Initial Catalog=test" -et -t tbTest
 或
 aspnet_regsql -C "Server=localhost;Integrated Security=True;Database=pubs" -et -t authors
  (此命令為pubs數(shù)據(jù)庫authors數(shù)據(jù)表的SQL緩存依賴.它會(huì)給authors表創(chuàng)建一個(gè)新的trigger,并添加一行新記錄到
   AspNet_SqlCacheTablesForChangeNotification表中)

2).必須在Web配置文件中配置SQL緩存依賴.


 <caching>
        
<sqlCacheDependency enabled="true" pollTime="1000">
          
<databases>
            
<add name="MyPubs" connectionStringName="Pubs"/>
          
</databases>
        
</sqlCacheDependency>
      
</caching>


3).最后應(yīng)用是要在OutputCache的屬性SqlDependency設(shè)置如:SqlDependency="MyDatabase:Movies"

 


<%@ OutputCache Duration="8888" VaryByParam="none" SqlDependency="MyPubs:authors,title,***" %>

<%= DateTime.Now.ToString("T"%><hr />
        
<asp:GridView ID="grdAuthors" runat="server" DataSourceID="srcAuthors" />
        
<br />
        
<asp:SqlDataSource ID="srcAuthors" runat="server" ConnectionString="<%$ ConnectionStrings:Pubs %>" SelectCommand="SELECT au_lname,au_fname,address FROM authors" />

 


6.3使用推SQL緩存依賴
      在使用MS SQL Server05時(shí),除了拉SQL緩存依賴,還可以使用推SQL緩存依賴.即MS SQL Server05包含一個(gè)名為查詢通知的功能,它在后臺(tái)使用MS SQL Server 05 的Service Broker.這個(gè)Service Broker可以在數(shù)據(jù)庫中的數(shù)據(jù)變更時(shí)自動(dòng)給應(yīng)用程序發(fā)送一個(gè)消息.(即推SQL緩存依賴是數(shù)據(jù)庫有更改時(shí)就發(fā)消息通知應(yīng)用程序,而拉SQL緩存依賴是應(yīng)用程序在一段時(shí)間間隔里向數(shù)據(jù)庫的特殊表查看是否數(shù)據(jù)庫有沒改變).
(注:推SQL緩存依賴有諸多的限制如:查詢的表名要兩部分如dbo.Movies而不是Movies,等N多限制)

6.4配置推SQL緩存依賴
1).必須配置數(shù)據(jù)庫啟用SQL Server 2005 Service Broker.
 6.4.1.1在MS sql server 05中隨便建立下列查詢來查看Service Broker是否已經(jīng)為特定的數(shù)據(jù)庫激活
  select name,is_broker_enabled from sys.databases
 6.4.1.2若Service Broker還沒有啟用,則要執(zhí)行Alter Database命令來啟用它,如:
  Alter Database TestDb Set Enable_Broker
 6.4.1.3最后,Asp.Net進(jìn)程必須有足夠的權(quán)限來訂閱查詢通知.(當(dāng)一個(gè)Asp.Net頁面由IIS處理,頁面在NETWORK SERVICE賬號(hào)  (WinServer03)或ASPNET賬號(hào)(對(duì)于其他系統(tǒng),如Win XP)上下文中執(zhí)行.
  給test服務(wù)器上的本地ASPNET賬號(hào)賦予需要的權(quán)限:
  GRANT SUBSCRIBE QUERY NOTIFICATIONS TO "test\ASPNET"

2).必須配置應(yīng)用程序開始監(jiān)聽通知.  
 6.4.2.1在應(yīng)用程序可以接收到變更通知之前,必須啟用查詢通知監(jiān)聽器.在Global.asax文件中啟用監(jiān)聽器:
 

 


void Application_Start(object sender, EventArgs e)
    
{
          
// 在應(yīng)用程序啟動(dòng)時(shí)運(yùn)行的代碼
        string conString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["Test"].ConnectionString;
        SqlDependency.Start(conString);
    }

 //只需要在Web.config中添加個(gè)數(shù)據(jù)庫連接字符串即可
 
 6.4.2.2最后使用推SQL緩存依賴實(shí)現(xiàn)對(duì)頁面輸出緩存(代碼如下所示:)

 


<%@ Page Language="C#" %>
<%@ OutputCache Duration="888" VaryByParam="none" SqlDependency="CommandNotification" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www./TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<script runat="server">

</script>

<html xmlns="http://www./1999/xhtml" >
<head runat="server">
    
<title>Push SQL OutputCache</title>
</head>
<body>
    
<form id="form1" runat="server">
    
<div>
    
<%= DateTime.Now.ToString("T"%><hr />
        
<asp:GridView ID="grdTest" runat="server" DataSourceID="srcTest" />
        
<br />
        
<asp:SqlDataSource ID="srcTest" runat="server" ConnectionString="<%$ ConnectionStrings:Test %>" SelectCommand="SELECT id,name FROM dbo.tbTest" />
    
</div>
    
</form>
</body>
</html>

 

SqlCacheDependency 類監(jiān)視輸出緩存所依賴的數(shù)據(jù)庫中的表,因此當(dāng)更新表中的項(xiàng)時(shí),使用基于表的輪詢時(shí)將從緩存中移除這些項(xiàng)。將通知(在 Microsoft SQL Server 2005 中)與 CommandNotification 值一起使用時(shí),最終將使用 SqlDependency 類向 SQL Server 2005 服務(wù)器注冊(cè)查詢通知。

注意
SqlDependency 屬性的 CommandNotification 值僅在網(wǎng)頁 (.aspx) 中有效。用戶控件只能將基于表的輪詢用于 @ OutputCache 指令。


 6.4.2.3對(duì)DataSource緩存使用推SQL緩存依賴(實(shí)例代碼:)



<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www./TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
     
protected void srcAuthors_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
    
{
        
this.lblMsg.Text = "正在從數(shù)據(jù)庫中查詢數(shù)據(jù)";
    }

</script>

<html xmlns="http://www./1999/xhtml" >
<head runat="server">
    
<title>無標(biāo)題頁</title>
</head>
<body>
    
<form id="form1" runat="server">
    
<div> 
    
<asp:Label ID="lblMsg" runat="server" />
        
<hr />
        
<asp:GridView ID="grdTest" runat="server" DataSourceID="srcTest" />
        
<asp:SqlDataSource ID="srcTest" runat="server"  ConnectionString="<%$ ConnectionStrings:Test %>" SelectCommand="SELECT id,name FROM dbo.tbTest"
             EnableCaching
="true" SqlCacheDependency="CommandNotification" OnSelecting="srcAuthors_Selecting"  />
    
    
</div>
    
</form>
</body>
</html>

 6.4.2.3對(duì)數(shù)據(jù)緩存使用推SQL緩存依賴(實(shí)例:)

 


<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Web.Configuration" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www./TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    
void Page_Load()
    
{
        DataTable dtTest 
= (DataTable)Cache["dtTest"];
        
if (dtTest==null)
        
{
            Trace.Warn(
"正在數(shù)據(jù)庫中獲取數(shù)據(jù)");
            
string conString = WebConfigurationManager.ConnectionStrings["Test"].ConnectionString;
            SqlDataAdapter da 
= new SqlDataAdapter("SELECT id,name FROM tbTest", conString);
            
//進(jìn)行推SQL緩存依賴設(shè)置
            SqlCacheDependency sqlDepend = new SqlCacheDependency(da.SelectCommand);
            
//要注意是Fill之前就綁定了緩存依賴
            
            da.Fill(dtTest);
            Cache.Insert(
"dtTest", dtTest, sqlDepend);
        }

        grdTest.DataSource 
= dtTest;
        grdTest.DataBind();
    }

</script>

<html xmlns="http://www./1999/xhtml" >
<head runat="server">
    
<title>無標(biāo)題頁</title>
</head>
<body>
    
<form id="form1" runat="server">
    
<div>
         
<asp:Label ID="lblMsg" runat="server" />
        
<asp:GridView ID="grdTest" runat="server" />
    
</div>
    
</form>
</body>
</html>

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多