重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
ASP.NET 中的緩存提供了對SQL依賴項的支持,也就是說當(dāng)SQL SERVER數(shù)據(jù)庫中的表或行中的數(shù)據(jù)被更改后,緩存中的頁面就失效,否則,頁面輸出可一直保留在緩存當(dāng)中。這確實為程序員提供了方便。但微軟一向很小家子氣,只為使用自家產(chǎn)品SQL SERVER的程序員提供了方便,那些用Oracle數(shù)據(jù)庫的ASP.NET程序員怎么辦呢?
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供魚峰網(wǎng)站建設(shè)、魚峰做網(wǎng)站、魚峰網(wǎng)站設(shè)計、魚峰網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、魚峰企業(yè)網(wǎng)站模板建站服務(wù),10多年魚峰做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
其實不用著急,因為ASP.NET中的緩存還提供了對文件依賴項的支持,也就是緩存依賴于某個文件,該文件被修改后,緩存中的頁面就失效。只要巧妙利用ASP.NET的文件依賴項緩存策略和Oracle中的觸發(fā)器,就可輕松實現(xiàn)依賴Oracle的緩存策略。思路很簡單,先將頁面的緩存策略設(shè)置為依賴某一個文件,再為Oracle中需要依賴的表添加一個觸發(fā)器,當(dāng)表中的數(shù)據(jù)被更改時,修改緩存所依賴的文件中的內(nèi)容。
下面以一個小例子來具體說明:
試驗?zāi)康?Default.aspx頁面的緩存依賴于Oracle數(shù)據(jù)庫中SCOTT用戶的DEPT表,該表中數(shù)據(jù)被更改后,緩存中的頁面失效。緩存的過期時間為120秒。
一、設(shè)置網(wǎng)站頁面的緩存依賴于文件TextFile.txt詳見System.Web.Caching.Cache類 Asp.NET緩存 各種緩存依賴二、在Oracle數(shù)據(jù)庫中創(chuàng)建觸發(fā)器
1、觸發(fā)器被觸發(fā)時執(zhí)行PL/SQL代碼塊。PL/SQL代碼塊直接讀寫操作系統(tǒng)中的文件,需調(diào)用內(nèi)置的utl_file程序包。這需要先修改Oracle的初始化參數(shù)文件INIT.ORA,在其中添加參數(shù)utl_file_dir,來指定文件的目錄。修改INIT.ORA文件后,需重啟Oracle數(shù)據(jù)庫,設(shè)置的參數(shù)才能生效。
在INIT.ORA文件中添加下面一行內(nèi)容:
utl_file_dir='E:/CSharp/CacheByOracleDependncy'
也可以設(shè)置為utl_file_dir=*,不指定具體目錄,即任何目錄都可以。
如果是Oracle 9i數(shù)據(jù)庫,還有一種方法也能起到同樣的作用:在sys用戶下創(chuàng)建一個directory目錄(實際上是在sys用戶下的dir$表中增加一個對應(yīng)的OS_PATH),然后將對該directory對象的讀/寫操作的權(quán)限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表)創(chuàng)建一個觸發(fā)器:當(dāng)DEPT表中的數(shù)據(jù)更改后,觸發(fā)器就會將當(dāng)前系統(tǒng)時間寫入TextFile.txt文件中。
[sql] view plain copy
CREATE OR REPLACE TRIGGER
"SCOTT"."TEST_CACHE_BY_ORACLE_DEPENDNCY" AFTERINSERT
OR UPDATE
OR DELETE OF "DEPTNO", "DNAME", "LOC" ON "SCOTT"."DEPT" DECLAREfile_handle utl_file.file_type;
BEGIN
--打開文件
file_handle := utl_file.fopen('FILEPATH','TextFile.txt','w');--將當(dāng)前系統(tǒng)時間寫入文件
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;
--關(guān)閉文件
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;
如果應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器不是同一臺服務(wù)器可能會遇到項目無法成功訪問文件進行依賴的情況:
解決方法詳見ASP.Net訪問網(wǎng)絡(luò)驅(qū)動器(映射磁盤)
-- 加入緩存.
SQL ALTER TABLE a CACHE;
Table altered.
-- 取消加入緩存.
SQL ALTER TABLE a NOCACHE;
Table altered.
4.在oracle 端做測試數(shù)據(jù)驗證
7.1 測試Load (不符合3條件時的報錯信息)