Loading...
  所在位置:论坛首页 -> ┈┋电脑网络技术区┋┈ -> Asp/Asp.Net技术 -> ASP.NET 2.0实现依赖Oracle的缓存策略
标题:ASP.NET 2.0实现依赖Oracle的缓存策略收藏 编辑 删除 楼主 | 上一篇 下一篇
晕菜两次
等级:社区游民
权限:普通用户
积分:8
金钱:200
声望:8
经验:8
发帖数:39
注册:2008年4月20日
资料 短消息2008-4-26 11:40:40
ASP.NET2.0中的缓存提供了对SQL依赖项的支持,也就是说当SQLSERVER数据库中的表或行中的数据被更改后,缓存中的页面就失效,否则,页面输出可一直保留在缓存当中。这确实为程序员提供了方便。但微软一向很小家子气,只为使用自家产品SQLSERVER的程序员提供了方便,那些用Oracle数据库的ASP.NET程序员怎么办呢?

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

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

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

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

  1、打开VisualStudio2005,在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=*,不指定具体目录,即任何目录都可以。

  如果是Oracle9i数据库,还有一种方法也能起到同样的作用:在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

  ORUPDATE

  ORDELETEOF"DEPTNO","DNAME","LOC"ON"SCOTT"."DEPT"DECLARE

  file_handleutl_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-ddhh24:mi:ss'));

  ENDIF;

  --关闭文件

  utl_file.fclose(file_handle);

  EXCEPTION

  WHEN OTHERS THEN

  BEGIN

  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的缓存策略成功了。

2008-4-26 11:40:40 顶部
第1页 共页 共0个回复     <<    >>    
 快速回复
  • 支持UBB,HTML标签

  • 高级回复

  • 操作选项:评分 加精 解精 奖惩 设专题 设公告 解公告 固顶 总固顶 解固顶 结帖 解结帖 锁帖 解锁 移帖 删帖
      首页 | 购买指南 | 商业版本 | 虚拟主机 | 特色介绍 | 下载中心 | 支付方式
    Copyright 2004-2008 BBSGood.com Powered By: BBSGood.Speed Version 5.0
      咨询电话:0575-85513832、0575-85513825(传真)、7*24小时咨询服务:13606552007 不良信息举报中心 浙ICP备05029817号
      业务QQ:38958768、客服QQ1:415896239、客服QQ2:343896043、MSN:jccsxx@hotmail.com