ASP.NET 2.0 內建快取相依功能,但僅支援 SQL Server。若使用 Oracle 資料庫,可巧妙結合「檔案相依」與「Oracle 觸發器」達成相同效果。
protected void Page_Load(object sender, EventArgs e) {
Label1.Text = "CacheByOracleDependency:" + DateTime.Now.ToString();
string filePath = Server.MapPath("TextFile.txt");
Response.AddFileDependency(filePath);
Response.Cache.SetExpires(DateTime.Now.AddSeconds(120));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(true);
}
需先設定 utl_file_dir 參數或建立 Directory 物件授權:
-- 方法一:修改 INIT.ORA(需重啟資料庫)
utl_file_dir='E:\CSharp\CacheByOracleDependncy'
-- 方法二:建立 Directory 物件(9i 以上適用)
CREATE OR REPLACE DIRECTORY FILEPATH AS 'E:\CSharp\CacheByOracleDependncy';
GRANT READ ON DIRECTORY FILEPATH TO PUBLIC;
建立觸發器,資料異動時寫入系統時間至文字檔:
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
IF utl_file.is_open(file_handle) THEN
utl_file.fclose(file_handle);
END IF;
END;
頁面每 120 秒自動刷新;手動修改 DEPT 表資料後,頁面立即更新,證明快取相依機制運作正常。