緩衝是每個系統都必定涉及到的功能,一般的緩衝有一個難題——什麼時候清除?如Asp.Net中的cache可以設定一個到期時間,但設定多久合適呢?長了浪費,短了就失去緩衝的意義了。使用SqlDependency進行緩衝則可以解決這個問題。
SqlDependency是.net2.0封裝的一個類型,當然要配合sql2005或以上版本才能使用。
SqlDependency類需要資料庫的ServiceBroker來支援,當資料庫中的資料發生變化時通知應用程式更新緩衝,這才是最有效緩衝方式。
步驟一:
sql資料庫必須開啟ServiceBroker服務,首先檢測是否已經啟用ServiceBroker,檢測方法:
Select DATABASEpRoPERTYEX('資料庫名稱','IsBrokerEnabled')
--1表示已經啟用0表示沒有啟用
步驟二:
如果ServiceBroker沒有啟用,使用下面語句啟用:
ALTER DATABASE <資料庫名稱> SET ENABLE_BROKER;
步驟三:
在實現基於服務的SQL資料緩衝依賴過程中,需要顯式調用SqlDependency.Start來啟動接受依賴項更改通知的接聽程式。
SqlDependency.Start(connectionString);//推薦將這段代碼加到Global.asax的Application_Start方法中
SqlDependency.Stop(connectionString);//用於關閉,可加在Global.asax的Application_End方法中
步驟四:緩衝實現
使用sqldependency實現緩衝的代碼:
public class CacheHelper
{
static Cache WebCache = HttpContext.Current.Cache;
static string DefaultConn = ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
public static DataTable GetSystemParams()
{
if (WebCache["SystemParam"] == null)
{
string strSQL = "select uSystemParamID,ParamName,ParamValue,Description from dbo.DTS_SystemParam";
SqlDataAdapter da = new SqlDataAdapter(strSQL, DefaultConn);
SqlDependency dep = new SqlDependency(da.SelectCommand);
dep.OnChange += new OnChangeEventHandler(dep_OnChange);
DataTable tbl = new DataTable();
da.Fill(tbl);
WebCache["SystemParam"] = tbl;
return tbl;
}
else
{
return (DataTable)WebCache["SystemParam"];
}
}
private static void dep_OnChange(object sender, SqlNotificationEventArgs e)
{
WebCache.Remove("SystemParam");
}
}
注意:使用 SqlDependency 訂閱查詢通知必須向SQL Server Service Broker提供製定規則的查詢語句,一般來講,必須是簡單的sql查詢語句(不能用*,不能用top,不能用函數,包括彙總函式,不能用子查詢,包括where後的子查詢,不能用外串連,自串連,不能用暫存資料表,不能用變數,不能用視圖,不能垮庫,表名之前必須加類似dbo資料庫擁有者這樣的首碼)例如:select * from table1,select column1 from table1,select count(*) from table1 都是錯誤的sql查詢語句,select column1 from dbo.table1 則是正確的語句。