網頁

SQL Server快取相依性

SQL Server本身可以與.NET Framework有很好的結合,在SQL Server有提供兩種快取相依模式:
  1. 輪詢模式(Polling)
    主要支援SQL Server 7.0 / 2000版本使用(也可在2005 / 2008使用,但最好不要)
    由ASP.NET來詢問資料庫,資料表是否有異動,來決定是否更新快取資料
  2. 查詢通知模式
    主要支援SQL Server 2005 / 2008版本使用
    由資料庫主動通知
看得出來,一者被動,一者主動。基本上如果你的網站是以資料主動,而且必須動態更新頁面資料,那當然是考慮使用查詢通知模式,因為輪詢模式有風險,也就是如果你是兩次輪詢之間更新資料,而使用者又是在你更新資料後,第二次輪詢之前連入,那他還是看得舊的快取資料,而非最新的資料。

啟用Service Broker


在SQL Server 2005 / 2008想要使用查詢通知模式,必須先對資料庫做個設定,你必須啟用「Service Broker」功能,因為查詢通知模式是由Service Broker所提供,但資料庫預設是不啟用。

啟動方法一:透過T-SQL
--enable啟用 
alter database northwind set enable_broker;
--disable停用
alter database northwind set disable_broker;

啟動方法二:SSMSE
物件總管 &rrar; 選擇資料庫 &rrar; 右鍵 &rrar; 屬性 &rrar; 選項 &rrar; Service Broker &rrar; 改為True

啟用Service Broker
做好SQL Server的設定後,我們就可以進到ASP.NET的設定,剛才只是開啟SQL Server的「查詢通知模式」,ASP.NET怎麼知道SQL Server有開啟此功能,而且ASP.NET是被動的角色,所以我們設定ASP.NET進入接聽模式,也就是等待SQL Server通知。

讓ASP.NET接聽通知


先新增一個「ASP.NET 網站」
  1. 然後打開Global.asax
  2. Import System.Data.SqlClient
  3. Import System.Web.Configuration
  4. 在Application_Start啟動SQL快取相依
  5. 在Application_End停用SQL快取相依

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' 應用程式啟動時執行的程式碼
SqlDependency.Start(WebConfigurationManager.ConnectionStrings("NorthwindConnectionString").ConnectionString.ToString())
End Sub
    
Sub Application_End(ByVal sender As Object, ByVal e As EventArgs)
' 應用程式關閉時執行的程式碼
SqlDependency.Stop(WebConfigurationManager.ConnectionStrings("NorthwindConnectionString").ConnectionString.ToString())
End Sub

透過SqlDependency.Start()來啟動快取相依,傳入連線字串是跟ASP.NET說我是要與那個資料庫進行快取相依。

Output Caching使用SqlDependency


在們到Default.aspx裡宣告Output Caching, 重點在必須使用屬性SqlDependency="CommandNotification"(UC不能使用):

<%@ OutputCache Duration="3600" VaryByParam="none" SqlDependency="CommandNotification" %>

在Default.aspx放置一個Lable及GridView,GridView取出資料庫資料(請自行實作),Lable在Page_Load寫一行程式:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Me.Label1.Text = Now.ToString()
End Sub


SqlDependency(GridView)

放時間是為了確定我們有快取,然後執行Default.aspx,在快取時間內,你不斷按重新整理,你會發現「時間」是不會更新,而且網頁動作也比較快,也就證明我們的快取是成功的,再來開啟SSMSE,修改GridView所顯示的表格的

SqlDependency效果
你會發現時間也更新了,資料也更新了,也就是SQL Server的快取相依性產生效果了。因為SQL Server發現你的資料有被異動過,所以自動通知ASP.NET移除快取,重新取得一份快取。

在SqlDataSource使用SqlDependency


如果你的頁面上只是簡單的GridView + SqlDataSource,那你可以減去宣告Output Cache那一段,可以直接將EnableCaching屬性改為True,將SqlCacheDependency屬性改為「CommandNotification」:

SqlDataSource -- SqlDependency屬性
這樣SqlDataSource可以直接使用SQL快取相依功能。

1 則留言:

  1. 最後一張圖的SqlCacheDependecy屬性值是「CommandNotification」,請自行更正。

    回覆刪除

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。