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; private void
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> public static
object GetCache( string CacheKey) { System.Web.Caching.Cache objCache = HttpRuntime.Cache; return objCache[CacheKey]; } /// <summary> /// 設置當前應用程序指定CacheKey的Cache值 /// </summary> /// <param name="CacheKey"></param> /// <param name="objObject"></param> public static
void SetCache( string CacheKey,
object objObject) { 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> public static
void SetCache( string CacheKey,
object objObject, 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→重新查詢數據並加入緩存.