ASP.NET緩存全解析6:數據庫緩存依賴

作者: 李天平  來源: 博客園  發布時間: 2010-08-01 13:42  閱讀: 13184 次  推薦: 11   原文鏈接   [收藏]  

  ASP.NET緩存全解析文章索引

  更多的時候,我們的服務器性能損耗還是在查詢數據庫的時候,所以對數據庫的緩存還是顯得特別重要,上面幾種方式都可以實現部分數據緩存功能。但問題是我們的數據有時候是在變化的,這樣用戶可能在緩存期間查詢的數據就是老的數據,從而導致數據的不一致。那有沒有辦法做到,數據如果不變化,用戶就一直從緩存中取數據,一旦數據變化,系統能自動更新緩存中的數據,從而讓用戶得到更好的用戶體驗。 

  答案是肯定的!.NET已經為我們提供了這樣一種非常好的解決方法:SqlCacheDependency數據庫緩存依賴。 

  實現步驟: 

  下面就讓我們看一下如何實現數據庫緩存依賴功能:

  第一步: 修改web.config,讓項目啟用SqlCacheDependency

  將下列代碼加入web.config<system.web>節:    

 

 
<?xml version="1.0"?>
<configuration>
<appSettings/>
<connectionStrings>
<add name="strcodematic" connectionString="data source=127.0.0.1;initial catalog=codematic;user id=sa;password=" providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
<caching>
<sqlCacheDependency enabled="true" pollTime="6000">
<databases>
 <add name="codematic" connectionStringName="strcodematic" />
</databases>
</sqlCacheDependency>
</caching>
<compilation debug="true">
</compilation>
<authentication mode="Windows"/>
</system.web>
</configuration>
  這里的connectionStringName指定了在<connectionStrings>中添加的某一個連接字符串。name則是為該SqlCacheDependency起的名字,這個名字將在第3步中用到。
  SqlCacheDependency類會自動完成對此配置節信息的讀取以建立和數據庫之間的聯系。

 

  注意:在<databases>節的<add name="codematic" connectionStringName="strcodematic"/>中的name屬性值必須和第三步的Page_Load代碼中System.Web.Caching.SqlCacheDependency("codematic","P_Product"); 中的第一個參數(數據庫名稱)相一致。
  第二步:執行下述命令,為 數據庫啟用緩存依賴。

  如果要配置SqlCacheDependency,則需要以命令行的方式執行。

  aspnet_regsql.exe工具位于Windows\\Microsoft.NET\\Framework\\[版本]文件夾中。

  aspnet_regsql -C "data source=127.0.0.1;initial catalog=codematic;user id=sa;password=" -ed -et -t "P_Product"

  參數-C后面的字符串是連接字符串(請替換成自己所需要的值),

  參數-t后面的字符串是數據表的名字。

  運行結果如圖15-3所示:

15-3  啟用數據庫緩存依賴

  命令執行后,在指定的數據庫中會多出一個AspNet_SqlCacheTablesForChangeNotification表。

  注意:

  要使得7.0或者2000版本以上的SQLServer支持SqlCacheDependency特性,需要對數據庫服務器執行相關的配置。

  有兩種方法配置SQLServer

  一使用aspnet_regsql命令行工具,

  二使用SqlCacheDependencyAdmin類。

  例如:

  aspnet_regsql -S "server"-E -d "database"–ed  或者

  aspnet_regsql -S "server"-E -d "database"-et -t "table"
  如果是Sql驗證的話要把-E換成,-U (用戶名),-P (密碼)

  以下是該工具的命令參數說明:

  -? 顯示該工具的幫助功能;

  -S 后接的參數為數據庫服務器的名稱或者IP地址;

  -U 后接的參數為數據庫的登陸用戶名;

  -P 后接的參數為數據庫的登陸密碼;

  -E 使用當前登錄用戶的 Windows 集成認證進行身份驗證。

  -d 后接參數為對哪一個數據庫采用SqlCacheDependency功能;

  -C 連接數據庫的連接字符串。如果您指定服務器(-S)和登錄(-U-P,或 -E)信息,則此選項不是必需的,因為連接字符串已經包含這些信息。

  -t 后接參數為對哪一個表采用SqlCacheDependency功能;

  -ed 允許對數據庫使用SqlCacheDependency功能;

  -dd 禁止對數據庫采用SqlCacheDependency功能;

  -et 允許對數據表采用SqlCacheDependency功能;

  -dt 禁止對數據表采用SqlCacheDependency功能;

  -lt 列出當前數據庫中有哪些表已經采用sqlcachedependency功能。

  第三步:在代碼中使用緩存,并為其設置SqlCacheDependency依賴:

 
/// <summary>
/// 獲取當前應用程序指定CacheKey的Cache對象值
/// </summary>
/// <param name="CacheKey">索引鍵值</param>
/// <returns>返回緩存對象</returns>
public static object GetCache(string CacheKey)
{
System.Web.Caching.Cache objCache
= HttpRuntime.Cache;
return objCache[CacheKey];
}

/// <summary>
/// 設置以緩存依賴的方式緩存數據
/// </summary>
/// <param name="CacheKey">索引鍵值</param>
/// <param name="objObject">緩存對象</param>
/// <param name="cacheDepen">依賴對象</param>
public static void SetCache(string CacheKey, object objObject, System.Web.Caching.CacheDependency dep)
{
System.Web.Caching.Cache objCache
= HttpRuntime.Cache;
objCache.Insert(
CacheKey,
objObject,
dep,
System.Web.Caching.Cache.NoAbsoluteExpiration,
//從不過期
System.Web.Caching.Cache.NoSlidingExpiration,//禁用可調過期
System.Web.Caching.CacheItemPriority.Default,
null);
}

protected void Page_Load(object sender, EventArgs e)
{

string CacheKey = "cachetest";
object objModel = GetCache(CacheKey);//從緩存中獲取
if (objModel == null)//緩存里沒有
{
objModel
= GetData();//把當前時間進行緩存
if (objModel != null)
{

//依賴數據庫codematic中的P_Product表變化 來更新緩存
System.Web.Caching.SqlCacheDependency dep = new System.Web.Caching.SqlCacheDependency("codematic", "P_Product");
SetCache(CacheKey, objModel, dep);
//寫入緩存
}
}

GridView1.DataSource
= (DataSet)objModel;
GridView1.DataBind();
}

//查詢數據
private DataSet GetData()
{

string conString = "data source=127.0.0.1;initial catalog=codematic;user id=sa;password=";
string strSQL = "SELECT * FROM P_Product";
SqlConnection myConnection
= new SqlConnection(conString);
DataSet ds
= new DataSet();
myConnection.Open();
SqlDataAdapter adapter
= new SqlDataAdapter(strSQL, myConnection);
adapter.Fill(ds,
"Product");
myConnection.Close();

return ds;
}

 

  從以上代碼可以看出,和文件依賴基本相同,只是在存放緩存SetCache時存入的依賴對象不同罷了。這里用的是SqlCacheDependency

  其中,創建SqlCacheDependency的構造方法:

  public SqlCacheDependency(string databaseEntryName,string tableName)

  databaseEntryName :是在Web.config 文件的 caching 節的 sqlCacheDependency databases 元素中定義的數據庫的名稱。

  tableName :與 SqlCacheDependency 關聯的數據庫表的名稱。

  這樣,只有當P_Product表的內容發生變化時,查詢操作才會重新查詢數據更新緩存的內容,可以大大減少數據庫的重復查詢和提高系統的性能和運行效率。

11
0
 
標簽:ASP.NET 緩存
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()