標籤:
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。
[sql] view plain copy
- create or replace directory FILEPATH as ‘E:/CSharp/CacheByOracleDependncy‘;
-
- grant read on directory FILEPATH to public;
這裡我使用的是第二種方法。
2、為所依賴的表(SCOTT使用者的DEPT表)建立一個觸發器:當DEPT表中的資料更改後,觸發器就會將當前系統時間寫入TextFile.txt檔案中。
[sql] view plain copy
- 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訪問網路磁碟機(映射磁碟)
ASP.NET Cache 實現依賴Oracle的緩衝策略