打印

[asp.net教程] asp.net 2.0实现依赖oracle的缓存策略

asp.net 2.0实现依赖oracle的缓存策略

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

TOP

返回顶部
AYBlue

Processed in 0.040836 second(s), 7 queries.

当前时区 GMT+8, 现在时间是 2009-1-10 11:22 京ICP备06054220号

清除 Cookies - 联系我们 - 163K.com - Archiver - WAP