分享
 
 
 

ASP.NET2.0实现依赖Oracle的缓存策略

王朝oracle·作者佚名  2008-05-21
窄屏简体版  字體: |||超大  

ASP.NET 2.0中的缓存提供了对SQL依赖项的支持,也就是说当SQL SERVER数据库中的表或行中的数据被更改后,缓存中的页面就失效,否则,页面输出可一直保留在缓存当中。这确实为程序员提供了方便。但微软一向很小家子气,只为使用自家产品SQL SERVER的程序员提供了方便,那些用Oracle数据库的ASP.NET程序员怎么办呢?

其实不用着急,因为ASP.NET 2.0中的缓存还提供了对文件依赖项的支持,也就是缓存依赖于某个文件,该文件被修改后,缓存中的页面就失效。只要巧妙利用ASP.NET 2.0的文件依赖项缓存策略和Oracle中的触发器,就可轻松实现依赖Oracle的缓存策略。思路很简单,先将页面的缓存策略设置为依赖某一个文件,再为Oracle中需要依赖的表添加一个触发器,当表中的数据被更改时,修改缓存所依赖的文件中的内容。

下面以一个小例子来具体说明:

试验目的:Default.aspx页面的缓存依赖于Oracle数据库中SCOTT用户的DEPT表,该表中数据被更改后,缓存中的页面失效。缓存的过期时间为120秒。

一、设置网站页面的缓存依赖于文件TextFile.txt

1、打开Visual Studio 2005,在E:\CSharp\CacheByOracleDependncy目录下新建一个WEB项目,在其Default.aspx页面上添加一个Label控件,显示页面生成的时间,以判断刷新时页面是否为重新生成的,并设置页面缓存依赖于文件E:\CSharp\CacheByOracleDependncy\TextFile.txt。

protected void Page_Load(object sender, EventArgs e)

{

//显示当前时间,以便判断是否为缓存中页面

this.Label1.Text = "CacheByOracleDependency:" + DateTime.Now.ToString();

//缓存依赖于文件TextFile.txt

string fileDependencyPath = Server.MapPath("TextFile.txt");

Response.AddFileDependency(fileDependencyPath);

// 设置缓存的过期时间为120秒。

Response.Cache.SetExpires(DateTime.Now.AddSeconds(120));

Response.Cache.SetCacheability(HttpCacheability.Public);

Response.Cache.SetValidUntilExpires(true);

}

2、在E:\CSharp\CacheByOracleDependncy目录下新建一个TextFile.txt文件。

二、在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。

create or replace directory FILEPATH as "E:\CSharp\CacheByOracleDependncy";

grant read on directory FILEPATH to public;

这里我使用的是第二种方法。

2、为所依赖的表(SCOTT用户的DEPT表)创建一个触发器:当DEPT表中的数据更改后,触发器就会将当前系统时间写入TextFile.txt文件中。

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;

三、测试

前面两步完成后,依赖Oracle的缓存策略就设置好了。只要DEPT表中的数据更改后,触发器就会修改TextFile.txt文件中的内容,TextFile.txt文件一被修改,缓存中的页面就自动失效了,再次访问页面时,请求就会发给服务器,来重新生成页面。

在Visual Studio 2005中调试程序,不断刷新打开的Default.aspx页面,页面显示的时间每隔120秒,才会发生变化一次。这是因为设置的缓存过期时间为120秒。这时,只要我们手工修改SCOTT用户的DEPT表中的数据后,再次刷新页面时,页面上显示的时间马上就会发生变化。这说明我们设置的依赖Oracle的缓存策略成功了。

(T114)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有