
其实不用着急,因为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" 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')--将当前系统时间写入文件
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访问网络驱动器(映射磁盘)
缓存另一块。oracle数据库数据在缓存中保留一段时间,直至其占有的缓冲区需要缓存另一块为止。OracleDatabase,又名OracleRDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)