標籤:style blog http color os io 使用 java ar
Asp.net資料庫緩衝依賴
更多的時候,我們的伺服器效能損耗還是在查詢資料庫的時候,所以對資料庫的緩衝還是顯得特別重要,上面幾種方式都可以實現部分資料緩衝功能。但問題是我們的資料有時候是在變化的,這樣使用者可能在緩衝期間查詢的資料就是老的資料,從而導致資料的不一致。那有沒有辦法做到,資料如果不變化,使用者就一直從緩衝中取資料,一旦資料變化,系統能自動更新緩衝中的資料,從而讓使用者得到更好的使用者體驗。
答案是肯定的!.NET已經為我們提供了這樣一種非常好的解決方案:SqlCacheDependency資料庫緩衝依賴。
實現步驟:
下面就讓我們看一下如何?資料庫緩衝依賴功能:
第一步: 修改web.config,讓項目啟用SqlCacheDependency 。
將下列代碼加入web.config的<system.web>節:
<?xml version="1.0"?><!-- 有關如何配置 ASP.NET 應用程式的詳細資料,請訪問 http://go.microsoft.com/fwlink/?LinkId=169433 --><configuration> <system.web> <caching> <sqlCacheDependency enabled="true" pollTime="6000"> <databases> <add name="codematic" connectionStringName="strcodematic" /> </databases> </sqlCacheDependency> </caching> </system.web> <connectionStrings> <add name="strcodematic" connectionString="server=.;database=XLinShaWyDBase;uid=sa;pwd=123"/> </connectionStrings></configuration>
這裡的connectionStringName指定了在<connectionStrings>中添加的某一個連接字串。name則是為該SqlCacheDependency起的名字,這個名字將在第3步中用到。
SqlCacheDependency類會自動完成對此配置節資訊的讀取以建立和資料庫之間的聯絡。
注意:在<databases>節的<add name="codematic" connectionStringName="strcodematic"/>中的name屬性值必須和第三步的Page_Load代碼中System.Web.Caching.SqlCacheDependency("codematic","dbo.Contact"); 中的第一個參數(資料庫名稱)相一致。
第二步:執行下述命令,為 資料庫啟用緩衝依賴。
如果要配置SqlCacheDependency,則需要以命令列的方式執行。
aspnet_regsql.exe工具位於Windows\\Microsoft.NET\\Framework\\[版本]檔案夾中。
如:(C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319)
aspnet_regsql -C "data source=.;initial catalog=XLinShaWyDBase;user id=sa;password=123" -ed -et -t "dbo.Contact"
參數-C後面的字串是連接字串(請替換成自己所需要的值),
參數-t後面的字串是資料表的名字。
生產成功後,在對應的資料庫,會多一個表dbo.AspNet_SqlCacheTablesForChangeNotification
select * from dbo.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依賴:
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Data.SqlClient;using System.Data;public partial class Default4 : System.Web.UI.Page{ /// <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", "dbo.Contact"); SetCache(CacheKey, objModel, dep);//寫入緩衝 } } GridView1.DataSource = (DataSet)objModel; GridView1.DataBind(); } private DataSet GetData() { string conString = "data source=.;initial catalog=XLinShaWyDBase;user id=sa;password=123"; string strSQL = "SELECT * FROM dbo.Contact"; SqlConnection myConnection = new SqlConnection(conString); DataSet ds = new DataSet(); myConnection.Open(); SqlDataAdapter adapter = new SqlDataAdapter(strSQL, myConnection); adapter.Fill(ds, "dbo.Contact"); myConnection.Close(); return ds; }}
從以上代碼可以看出,和檔案依賴基本相同,只是在存放緩衝SetCache時存入的依賴對象不同罷了。這裡用的是SqlCacheDependency。
其中,建立SqlCacheDependency的構造方法:
public SqlCacheDependency(string databaseEntryName,string tableName)
databaseEntryName :是在Web.config 檔案的 caching 節的 sqlCacheDependency 的 databases 元素中定義的資料庫的名稱。
tableName :與 SqlCacheDependency 關聯的資料庫表的名稱。
這樣,只有當dbo.Contact表的內容發生變化時,查詢操作才會重新查詢資料更新緩衝的內容,可以大大減少資料庫的重複查詢和提高系統的效能和運行效率。
Asp.net資料庫緩衝依賴