系統緩存全解析6:數據庫緩存依賴

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

  .NET已經爲咱們提供了這樣一種很是好的解決方法:SqlCacheDependency數據庫緩存依賴。sql

  

實現步驟:數據庫

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

第一步: 修改web.config,讓項目啓用SqlCacheDependency 。服務器

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

<?xmlversion="1.0"?>ide

<configuration>工具

    <appSettings/>性能

    <connectionStrings>spa

        <addname="strcodematic"connectionString="data source=127.0.0.1;initial catalog=codematic;user id=sa;password=" providerName="System.Data.SqlClient" />

    </connectionStrings>

    <system.web>

        <caching>

            <sqlCacheDependencyenabled="true"pollTime="6000">

                <databases>

                    <addname="codematic"connectionStringName="strcodematic" />

                </databases>

            </sqlCacheDependency>         

        </caching>

    

        <compilationdebug="true">

        </compilation>     

        <authenticationmode="Windows"/>      

    </system.web>

</configuration>

 

 

這裏的connectionStringName指定了在<connectionStrings>中添加的某一個鏈接字符串。name則是爲該SqlCacheDependency起的名字,這個名字將在第3步中用到。
SqlCacheDependency類會自動完成對此配置節信息的讀取以創建和數據庫之間的聯繫。

 

注意:

<databases>節的<addname="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;initialcatalog=codematic;user id=sa;password=" -ed -et -t"P_Product"

參數-C後面的字符串是鏈接字符串(請替換成本身所須要的值),

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

 

圖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>

///獲取當前應用程序指定CacheKeyCache對象值

///</summary>

///<param name="CacheKey">索引鍵值</param>

///<returns>返回緩存對象</returns>

public staticobject 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 staticvoid 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)

 

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

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

    這樣,只有當P_Product表的內容發生變化時,查詢操做纔會從新查詢數據更新緩存的內容,能夠大大減小數據庫的重複查詢和提升系統的性能和運行效率。

相關文章
相關標籤/搜索