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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 剖析SQL Server 2005查詢通知之基礎篇SQLServer
- 使用SQL SERVER 2005/2008 遞迴CTE查詢樹型結構SQLServer遞迴
- SQL Server 2005:查詢統計資訊SQLServer
- SQL Server 2008 查詢優化SQLServer優化
- SQL查詢總結SQL
- 優化SQL Server 2008的查詢效能優化SQLServer
- SQL Server資料庫查詢優化的方法總結SQLServer資料庫優化
- 關於SQL Server資料查詢基本方法的總結SQLServer
- Sql server2005 優化查詢速度50個方法小結SQLServer優化
- SQL Server 2005資料庫中表的遞迴查詢SQLServer資料庫遞迴
- SQL總結(一)基本查詢SQL
- SQL總結(三)其他查詢SQL
- SQL Server 2008 高階查詢優化概念SQLServer優化
- 查詢SQL Server 2005資料庫重做日誌的資訊SQLServer資料庫
- Microsoft SQL Server 2005中查詢優化器使用的統計資訊二(zt)ROSSQLServer優化
- Microsoft SQL Server 2005中查詢優化器使用的統計資訊三(zt)ROSSQLServer優化
- Microsoft SQL Server 2005中查詢優化器使用的統計資訊一(zt)ROSSQLServer優化
- SQL2005/2008中的CTE應用--遞迴查詢SQL遞迴
- SQL總結(二)連表查詢SQL
- SQL總結(七)查詢實戰SQL
- SQL Server 2008 實施查詢優化建議SQLServer優化
- SQL Server 2008將計劃指南與查詢匹配SQLServer
- SQL Server 查詢分解SQLServer
- SQL Server 2005:模擬Oracle的desc命令編寫的describe,查詢表的結構SQLServerOracle
- SQL Server調優系列基礎篇(子查詢運算總結)SQLServer
- 關於SQL Server 2008是否是SQL Server 2005的一個Service PackSQLServer
- SQL單表查詢語句總結SQL
- expdp/impdp的使用總結 (供查詢使用)
- SQL Server遞迴查詢SQLServer遞迴
- SQL SERVER 查詢鎖資訊SQLServer
- SQL server跨庫查詢SQLServer
- Sql Server系列:子查詢SQLServer
- SQL server 查詢語句SQLServer
- SQL Server 分散式查詢SQLServer分散式
- SQL SERVER 動態查詢SQLServer
- SQL Server 跨域查詢SQLServer跨域
- 在Eclipse中用JDBC連線Sql Server 2005總結EclipseJDBCSQLServer
- Sql Server 使用CTE實現遞迴查詢SQLServer遞迴