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

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

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

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

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

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

  詳見System.Web.Caching.Cache類 Asp.Net緩存 各種緩存依賴

二、在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;

如果應用服務器和數據庫服務器不是同一臺服務器可能會遇到項目無法成功訪問文件進行依賴的情況:

解決方法詳見ASP.NET訪問網絡驅動器(映射磁盤)

發佈了17 篇原創文章 · 獲贊 9 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章