程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> Sql Server 2005/2008 SqlCacheDependency查詢通知的使用總結

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

編輯:關於SqlServer

  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裡增加一個數據庫連接字符串.

  <connectionStrings>
    <add name="TestConnectionString" connectionString="Data Source=bob-pc\DEVDBServer;Initial Catalog=GFDB;Persist Security Info=True;User ID=test;PassWord=*" 
    providerName="System.Data.sqlClIEnt"/>
  </connectionStrings>
  <system.web>
  </system.web>

  如果您的應用程序數據庫連接字符串如果不存放在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裡運行沒問題,但有些不經濟。      

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved