asp.net數據庫緩存依賴

1.爲數據庫啓用緩存依賴(您需要具有管理特權,或管理帳戶和密碼。)

在"Visual Studio 命令提示(2010(這裏我用的是2010版本的,可以使用VS2005)"運行aspnet_regsql

(MSSQL 2000啓用方式略有不同)

aspnet_regsql.exe -S Excel-lang -U sa -P sa -ed -d TestDB -et -t UserInfo

或者

aspnet_regsql -C "data source=Excel-lang;initial catalog=TestDB;user id=sa;password=sa" -ed -et -t "UserInfos"

注:1.數據庫服務器名稱爲 Excel-lang 2.用戶和密碼爲 sa sa 3.數據庫和表分別爲 TestDB UserInfo
運行完成後會在數據庫下面產生一張表AspNet_SqlCacheTablesForChangeNotification和一個觸發器

2.檢查數據庫是否啓用監聽服務

Select DataBasePropertyex('TestDB','IsBrokerEnabled')

或者

SELECT is_broker_enabled FROM sys.databases WHERE name = 'TestDB'

(1爲已啓用,0爲未啓用)

如果沒有啓用

使用語句ALTER DATABASE TestDB SET ENABLE_BROKER;啓用監聽服務

如果啓用失敗或者很長時間一直在執行請執行一下語句

ALTER DATABASE TestDB SET NEW_BROKER WITH ROLLBACK IMMEDIATE;

ALTER DATABASE TestDB SET ENABLE_BROKER;

3.配置WebConfig

<configuration>
 <connectionStrings>節點下配置

<add name="TestDBConnectionString" connectionString="Data Source=EXCEL-LANG;Initial Catalog=TestDB;Persist Security Info=True;User ID=sa;Password=sa" providerName="System.Data.SqlClient" />
  </connectionStrings>

 <system.web>   節點下配置

 <caching>
      <sqlCacheDependency enabled="true" pollTime="1000">
        <databases>
          <add name="TestDB" connectionStringName="TestDBConnectionString"/>
        </databases>
      </sqlCacheDependency>
    </caching>

各節點屬性請參照MSDN相關文檔

4.頁面加載時執行以下代碼,從數據庫中獲取數據並加入緩存中

1
2
3
4
5
6
7
8
List<UserInfo> list = DataCache.GetCache("UserInfoCache")as List<UserInfo>;
if (list == null)
{
    System.Web.Caching.SqlCacheDependency dep =new System.Web.Caching.SqlCacheDependency("TestDB","UserInfo");
    list = userManger.GetUserLoginList();
    onMoveBack =new CacheItemRemovedCallback(RemovedCallback);
    DataCache.SetCache("UserInfoCache", list, dep, onMoveBack);
}

5.申明緩存失效後所執行的函數

1
2
3
4
5
6
7
8
CacheItemRemovedCallback onMoveBack;
 privatevoid RemovedCallback(String k, Object v, CacheItemRemovedReason r)
 {
     onMoveBack =new CacheItemRemovedCallback(RemovedCallback);
     System.Web.Caching.SqlCacheDependency dep =new System.Web.Caching.SqlCacheDependency("TestDB","UserInfo");
     List<UserInfo> list = userManger.GetUserLoginList();//從數據庫中獲取數據
   DataCache.SetCache("UserInfoCache", list, dep,onMoveBack);
 }

6.DataCache類 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Web.Caching;
 
public class DataCache
{
    /// <summary>
    /// 獲取當前應用程序指定CacheKey的Cache值
    /// </summary>
    /// <param name="CacheKey"></param>
    /// <returns></returns>
    publicstatic objectGetCache(stringCacheKey)
    {
        System.Web.Caching.Cache objCache = HttpRuntime.Cache;
        returnobjCache[CacheKey];
    }
    /// <summary>
    /// 設置當前應用程序指定CacheKey的Cache值
    /// </summary>
    /// <param name="CacheKey"></param>
    /// <param name="objObject"></param>
    publicstatic voidSetCache(stringCacheKey, objectobjObject)
    {
        System.Web.Caching.Cache objCache = HttpRuntime.Cache;
        objCache.Insert(CacheKey, objObject);
    }
    /// <summary>
    /// 設置已緩存依賴的方式緩存數據
    /// </summary>
    /// <param name="CacheKey">鍵值</param>
    /// <param name="objObject">緩存對象</param>
    /// <param name="dep">緩存依賴項</param>
    /// <param name="onMoveCallBack">緩存項移除是觸發的回調函數</param>
    publicstatic voidSetCache(stringCacheKey, objectobjObject, System.Web.Caching.CacheDependency dep, CacheItemRemovedCallback onMoveCallBack)
    {
        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,
        onMoveCallBack
        );
    }
}

7.執行步驟爲從數據庫查詢數據→加入緩存(同時設置過期策略以及過期回調函數)→過期時→執行過期回調函數

 RemovedCallback→重新查詢數據並加入緩存.

發佈了44 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章