ASP.NET 2.0 內建的 SqlCacheDependency 僅支援 SQL Server,使用 Oracle 的開發者若想享受資料變更自動使快取失效的便利,需另闢蹊徑。本文示範如何結合「檔案相依性」與「Oracle 觸發器」,輕鬆實作相依於 Oracle 資料表的頁面輸出快取。
INSERT/UPDATE/DELETE 時,觸發器執行 PL/SQL 區塊,修改該實體檔案的內容(如寫入時間戳)。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)); // 120 秒過期
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(true);
}
並在專案根目錄建立 TextFile.txt(內容可為空)。
讓資料庫能讀寫作業系統檔案,有兩種方式:
utl_file_dir='E:\CSharp\CacheByOracleDependncy' 並重啟資料庫。CREATE OR REPLACE DIRECTORY FILEPATH AS 'E:\CSharp\CacheByOracleDependncy';
GRANT READ, WRITE ON DIRECTORY FILEPATH TO PUBLIC;
CREATE OR REPLACE TRIGGER trg_dept_cache_sync
AFTER INSERT OR UPDATE OR DELETE ON SCOTT.DEPT
FOR EACH ROW
DECLARE
fHandle UTL_FILE.FILE_TYPE;
BEGIN
fHandle := UTL_FILE.FOPEN('FILEPATH', 'TextFile.txt', 'W');
UTL_FILE.PUT_LINE(fHandle, TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS'));
UTL_FILE.FCLOSE(fHandle);
EXCEPTION
WHEN OTHERS THEN
IF UTL_FILE.IS_OPEN(fHandle) THEN UTL_FILE.FCLOSE(fHandle); END IF;
END;
SCOTT.DEPT 執行任意 DML 操作。UTL_FILE 套件的執行權限。DBMS_CHANGE_NOTIFICATION)。透過「檔案相依性 + 觸發器修改檔案」的巧妙組合,ASP.NET 2.0 也能輕鬆支援 Oracle 資料庫的快取同步,無需第三方元件,架構簡潔且好維護。