程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> ASP.NET 2.0實現依賴Oracle的緩存策略

ASP.NET 2.0實現依賴Oracle的緩存策略

編輯:Oracle數據庫基礎

ASP.NET 2.0中的緩存提供了對SQL依賴項的支持,也就是說當SQL SERVER數據庫中的表或行中的數據被更改後,緩存中的頁面就失效,否則,頁面輸出可一直保留在緩存當中。這確實為程序員提供了方便。但微軟一向很小家子氣,只為使用自家產品SQL Server的程序員提供了方便,那些用Oracle數據庫的ASP.Net程序員怎麼辦呢?

其實不用著急,因為ASP.NET 2.0中的緩存還提供了對文件依賴項的支持,也就是緩存依賴於某個文件,該文件被修改後,緩存中的頁面就失效。只要巧妙利用ASP.Net 2.0的文件依賴項緩存策略和Oracle中的觸發器,就可輕松實現依賴Oracle的緩存策略。思路很簡單,先將頁面的緩存策略設置為依賴某一個文件,再為Oracle中需要依賴的表添加一個觸發器,當表中的數據被更改時,修改緩存所依賴的文件中的內容。

下面以一個小例子來具體說明:

試驗目的:Default.ASPx頁面的緩存依賴於Oracle數據庫中SCOTT用戶的DEPT表,該表中數據被更改後,緩存中的頁面失效。緩存的過期時間為120秒。

一、設置網站頁面的緩存依賴於文件TextFile.txt

1、打開Visual Studio 2005,在E:\\CSharp\\CacheByOracleDependncy目錄下新建一個WEB項目,在其Default.ASPx頁面上添加一個Label控件,顯示頁面生成的時間,以判斷刷新時頁面是否為重新生成的,並設置頁面緩存依賴於文件E:\\CSharp\\CacheByOracleDependncy\\TextFile.txt。

protected void Page_Load(object sender, EventArgs e)
{
 //顯示當前時間,以便判斷是否為緩存中頁面
 this.Label1.Text = "CacheByOracleDependency:" + DateTime.Now.ToString();
 //緩存依賴於文件TextFile.txt
 string fileDependencyPath = Server.MapPath("TextFile.txt");
 Response.AddFileDependency(fileDependencyPath);
 // 設置緩存的過期時間為120秒。
 Response.Cache.SetExpires(DateTime.Now.AddSeconds(120));
 Response.Cache.SetCacheability(HttpCacheability.Public);
 Response.Cache.SetValidUntilExpires(true);
}

2、在E:\\CSharp\\CacheByOracleDependncy目錄下新建一個TextFile.txt文件。

二、在Oracle數據庫中創建觸發器

1、觸發器被觸發時執行PL/SQL代碼塊。PL/SQL代碼塊直接讀寫操作系統中的文件,需調用內置的utl_file程序包。這需要先修改Oracle的初始化參數文件INIT.ORA,在其中添加參數utl_file_dir,來指定文件的目錄。修改INIT.ORA文件後,需重啟Oracle數據庫,設置的參數才能生效。

在INIT.ORA文件中添加下面一行內容:

utl_file_dir=\'E:\\CSharp\\CacheByOracleDependncy\'

也可以設置為utl_file_dir=*,不指定具體目錄,即任何目錄都可以。

如果是Oracle 9i數據庫,還有一種方法也能起到同樣的作用:在sys用戶下創建一個directory目錄(實際上是在sys用戶下的dir$表中增加一個對應的OS_PATH),然後將對該directory對象的讀/寫操作的權限grant給public。

create or replace directory FILEPATH as \'E:\\CSharp\\CacheByOracleDependncy\';
grant read on directory FILEPATH to public;

這裡我使用的是第二種方法。

2、為所依賴的表(SCOTT用戶的DEPT表)創建一個觸發器:當DEPT表中的數據更改後,觸發器就會將當前系統時間寫入TextFile.txt文件中。

CREATE OR REPLACE TRIGGER
"SCOTT"."TEST_CACHE_BY_Oracle_DEPENDNCY" AFTER
INSERT
OR UPDATE
OR DELETE OF "DEPTNO", "DNAME", "LOC" ON "SCOTT"."DEPT" DECLARE
file_handle utl_file.file_type;
BEGIN
--打開文件
file_handle := utl_file.fopen(\'FILEPATH\',\'TextFile.txt\',\'w\');
--將當前系統時間寫入文件
IF utl_file.is_open(file_handle) THEN
 utl_file.put_line(file_handle,to_char(SYSDATE,\'yyyy-mm-dd hh24:mi:ss\'));
END IF;
--關閉文件
utl_file.fclose(file_handle);
EXCEPTION
WHEN OTHERS THEN
BEGIN
 IF utl_file.is_open(file_handle) THEN
  utl_file.fclose(file_handle);
 END IF;
EXCEPTION
 WHEN OTHERS THEN
  NULL;
 END;
END;

三、測試

前面兩步完成後,依賴Oracle的緩存策略就設置好了。只要DEPT表中的數據更改後,觸發器就會修改TextFile.txt文件中的內容,TextFile.txt文件一被修改,緩存中的頁面就自動失效了,再次訪問頁面時,請求就會發給服務器,來重新生成頁面。

在Visual Studio 2005中調試程序,不斷刷新打開的Default.ASPx頁面,頁面顯示的時間每隔120秒,才會發生變化一次。這是因為設置的緩存過期時間為120秒。這時,只要我們手工修改SCOTT用戶的DEPT表中的數據後,再次刷新頁面時,頁面上顯示的時間馬上就會發生變化。這說明我們設置的依賴Oracle的緩存策略成功了。

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