Sql Server 2005/2008 SqlCacheDependency查詢通知的使用總結
Sql server 7.0/2000下 SqlCacheDependency使用輪詢的方式進行快取失效檢查, 雖然ms說對伺服器壓力不大, 但還是有一些的, 而且對於不常改動的混存內容無休止的輪詢感覺有點浪費, 不很經濟.
Sql server 2005/2008下增加使用查詢通知方式進行快取失效檢查, 它通過Sql Server內部的訊息佇列進行非同步通知, 這樣就大大減輕了伺服器的壓力, 實現的很經濟, 下面就是具體的步驟:
1.檢測是否已經啟用Service Broker
Select DATABASEpRoPERTYEX('資料庫名稱','IsBrokerEnabled') -- 1 表示已經啟用 0 表示沒有啟用
2.啟用Service Broker
ALTER DATABASE 資料庫名稱 SET ENABLE_BROKER;
注意:如果執行此語句處於假死狀態,請重啟(restart)資料庫,然後什麼都別做, 先執行上面啟用Service Broker這個語句就行了!
3.給您的資料庫訪問帳號授予許可權
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO test
注意:這一步非常重要, 如果沒有許可權, 資料庫改變的通知將無法接收, cache永遠都不會被重新整理,我開始是用的sa帳號,死活都不重新整理,花了我兩天時間除錯這個問題, 還是無法給sa授此許可權(ms禁止), 所以,換個資料庫訪問帳號即可.
4.確定資料庫連線字串.
您可以在web.config裡增加一個資料庫連線字串.
providerName="System.Data.sqlClient"/>
如果您的應用程式資料庫連線字串如果不存放在web.config中, 也沒關係, 這不是必須的,您只要能在下面訪問到即可.
5.啟動SqlDependency監聽.
在Global.ascx裡的Application_Start和Application_End裡增加如下程式碼:
void Application_Start(object sender, EventArgs e)
{
string connString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString;
System.Data.SqlClient.SqlDependency.Start(connString);
}
void Application_End(object sender, EventArgs e)
{
string connString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString;
System.Data.SqlClient.SqlDependency.Stop(connString);
}
注意:System.Data.SqlClient.SqlDependency.Start(connString)可以多次執行,也就是說,除了在這裡,您還可以在您程式的程式碼里加上這句。
6.主體程式
從cache或db中獲取資料。
private DataSet GetData()
{
if (HttpRuntime.Cache["EntityResourceCollection"] != null)
{
//get entity resource collection from cache
return (DataSet)HttpRuntime.Cache["EntityResourceCollection"];
}
else
{
//get from database
DataSet ds = new DataSet();
SqlDependency.Start(ConfigurationManager.ConnectionStrings["GFDBConnectionString"].ConnectionString);
using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["GFDBConnectionString"].ConnectionString))
{
string sql = " Select cityid, cityname From dbo.tbl_city";
using (SqlCommand command = new SqlCommand(sql, connection))
{
SqlCacheDependency dependency = new SqlCacheDependency(command);
using (SqlDataAdapter adapter = new SqlDataAdapter()) //查詢資料
{
adapter.SelectCommand = command;
adapter.Fill(ds);
}
HttpRuntime.Cache.Insert("EntityResourceCollection", ds, dependency);
}
}
return ds;
}
}
注意: string sql = " Select cityid, cityname From dbo.tbl_city";語句的要求非常嚴格,具體請參照msdn介紹。
基本上就是這6步。
注意, 如果您的程式碼中使用了SqlCacheDependencyAdmin.EnableNotifications(connectionString), 或者SqlCacheDependency是使用(庫名,表名)方式構建的 SqlCacheDependency scd = new SqlCacheDependency("資料庫名稱","表名"),這說明,您仍然在使用sqlserver 7.0/2000 輪詢的方式進行快取依賴檢查,雖然在sql 2005/2008裡執行沒問題,但有些不經濟。
在寫此文的過程中我參考了許多朋友的帖子, 在此一併感謝,下面將參考過的帖子列在下面。
http://www.cnblogs.com/over140/archive/2009/01/15/1376318.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-630489/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Microsoft SQL Server 2005中查詢優化器使用的統計資訊一(zt)ROSSQLServer優化
- Microsoft SQL Server 2005中查詢優化器使用的統計資訊三(zt)ROSSQLServer優化
- Microsoft SQL Server 2005中查詢優化器使用的統計資訊二(zt)ROSSQLServer優化
- SQL查詢總結SQL
- SQL Server 2008中Analysis Services的新特性——深入SQL Server 2008SQLServer
- SQL Server 2000/2005/2008刪除或壓縮資料庫日誌的方法SQLServer資料庫
- [翻譯]SQL Server 2005 Analysis Services效能指南 Part 1 - 理解查詢構架SQLServer
- 理解SQL Server 2008索引的儲存結構YDSQLServer索引
- SQL SERVER 2008安全配置SQLServer
- Sql Server 的引數化查詢SQLServer
- SQL單表查詢語句總結SQL
- VS2005(vs2008,vs2010)使用map檔案查詢程式崩潰原因
- SQL2005、2008、2000 清空刪除日誌SQL
- sql-server高階查詢SQLServer
- sql server 2005資料庫快照SQLServer資料庫
- 使用SSMS連線和查詢 SQL Server 例項SSMSQLServer
- SQL Server2005使用CTE實現遞迴QCSQLServer遞迴
- SQL Server查詢慢的解決方案SQLServer
- 已安裝 SQL Server 2005 Express 工具。若要繼續,請刪除 SQL Server 2005 Express 工具SQLServerExpress
- Oracle總結【SQL細節、多表查詢、分組查詢、分頁】OracleSQL
- SQL Server 查詢歷史執行的SQL語句SQLServer
- SQL Server 跨資料庫查詢SQLServer資料庫
- sql-server不相關子查詢SQLServer
- sql-server相關子查詢SQLServer
- SQL Server解惑——查詢條件IN中能否使用變數SQLServer變數
- SQL Server 2005效能調整二(zt)SQLServer
- SQL Server 2005效能調整一(zt)SQLServer
- sql server 2005 資料修改的內部原理SQLServer
- SQL Server 語句日期格式查詢方法SQLServer
- SQL Server 查詢超時問題排查SQLServer
- SQL Server-簡單查詢語句SQLServer
- 使用sql語句查詢平均值,使用sql語句查詢資料總條數, not in 篩選語句的使用SQL
- 查詢SQL Server的歷史執行記錄SQLServer
- SQL SERVER 2012查詢資料庫和所有表的大小方法彙總SQLServer資料庫
- SQL Server 2008中的行壓縮(上)JUSQLServer
- SQL SERVER死鎖查詢,死鎖分析,解鎖,查詢佔用SQLServer
- MongoDB查詢總結MongoDB
- SQL Server 查詢表註釋和欄位SQLServer
- SQL Server中Table字典資料的查詢SQL示例程式碼SQLServer