Sql Server 2005/2008 SqlCacheDependency查詢通知的使用總結

iSQlServer發表於2010-03-26

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章