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

  其实不用着急,因为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。

  1. create or replace directory FILEPATH as 'E:/CSharp/CacheByOracleDependncy';
  2. grant read on directory FILEPATH to public;

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

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

  1. CREATE OR REPLACE TRIGGER
  2. "SCOTT"."TEST_CACHE_BY_ORACLE_DEPENDNCY" AFTER
  3. INSERT
  4. OR UPDATE
  5. OR DELETE OF "DEPTNO", "DNAME", "LOC" ON "SCOTT"."DEPT" DECLARE
  6. file_handle utl_file.file_type;
  7. BEGIN
  8. --打开文件
  9. file_handle := utl_file.fopen('FILEPATH','TextFile.txt','w');
  10. --将当前系统时间写入文件
  11. IF utl_file.is_open(file_handle) THEN
  12.  utl_file.put_line(file_handle,to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss'));
  13. END IF;
  14. --关闭文件
  15. utl_file.fclose(file_handle);
  16. EXCEPTION
  17. WHEN OTHERS THEN
  18. BEGIN
  19. IF utl_file.is_open(file_handle) THEN
  20. utl_file.fclose(file_handle);
  21. END IF;
  22. EXCEPTION
  23. WHEN OTHERS THEN
  24. NULL;
  25. END;
  26. END;

如果应用服务器和数据库服务器不是同一台服务器可能会遇到项目无法成功访问文件进行依赖的情况:

解决方法详见ASP.NET访问网络驱动器(映射磁盘)

ASP.NET Cache 实现依赖Oracle的缓存策略的更多相关文章

  1. ASP.NET Cache

    ASP.NET为了方便我们访问Cache,在HttpRuntime类中加了一个静态属性Cache,这样,我们就可以在任意地方使用Cache的功能. 而且,ASP.NET还给它增加了二个“快捷方式”:P ...

  2. 细说 ASP.NET Cache 及其高级用法

    许多做过程序性能优化的人,或者关注过程程序性能的人,应该都使用过各类缓存技术. 而我今天所说的Cache是专指ASP.NET的Cache,我们可以使用HttpRuntime.Cache访问到的那个Ca ...

  3. 细说 ASP.NET Cache 及其高级用法【转】

    阅读目录 开始 Cache的基本用途 Cache的定义 Cache常见用法 Cache类的特点 缓存项的过期时间 缓存项的依赖关系 - 依赖其它缓存项 缓存项的依赖关系 - 文件依赖 缓存项的移除优先 ...

  4. [转]细说 ASP.NET Cache 及其高级用法

    本文转自:http://www.cnblogs.com/fish-li/archive/2011/12/27/2304063.html 阅读目录 开始 Cache的基本用途 Cache的定义 Cach ...

  5. asp.net cache 缓存

    就是希望让Web应用程序从一开始运行到结束都一直存在,有人就说为什么不用Application呢?其实Cache是可以一段时间内自动更新数据的,而Application就无法做成这样的,另外Appli ...

  6. 初遇 Asp.net MVC 数据库依赖缓存那些事儿

    问题背景: 最近做一个非常简单的功能,就是使用ajax请求的方式从服务端请求一段下拉表的数据. 以前也有做过这个功能,只不过这次做这个功能的时候冒出了一个想法: 我请求的这段数据它是一段相对比较固定的 ...

  7. ASP.NET MVC 数据库依赖缓存

    ASP.NET MVC 数据库依赖缓存   问题背景 最近做一个非常简单的功能,就是使用ajax请求的方式从服务端请求一段下拉表的数据. 以前也有做过这个功能,只不过这次做这个功能的时候冒出了一个想法 ...

  8. ASP.NET Cache缓存的使用

    ASP.NET Cache是提升系统性能的重要方法,它使用了“最近使用”原则(a least-recently-used algorithm).在数据库访问中经常会用到Cache保存数据库数据. 1. ...

  9. ASP.NET Cache缓存的用法

    本文导读:在.NET运用中经常用到缓存(Cache)对象.有HttpContext.Current.Cache以及HttpRuntime.Cache,HttpRuntime.Cache是应用程序级别的 ...

随机推荐

  1. 第十三节:pandas之groupby()分组

    1.Series()对象分组 1.1.单级索引 1.2.多级索引 2.DataFrame()对象分组 3.获取一个分组,遍历分组,filter过滤.

  2. 7-19 求链式线性表的倒数第K项

    7-19 求链式线性表的倒数第K项(20 分) 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示 ...

  3. 6.3.2 使用struct模块读写二进制文件

    使用 struct 模块需要使用 pack() 方法吧对象按指定个数进行序列化,然后使用文件对象的write方法将序列化的结果写入二进制文件:读取时需要使用文件对象的read()方法读取二进制文件内容 ...

  4. 清北学堂模拟赛d2t1 一道图论神题(god)

    题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的.假 ...

  5. LightOJ - 1148 - Mad Counting

    先上题目: 1148 - Mad Counting   PDF (English) Statistics Forum Time Limit: 0.5 second(s) Memory Limit: 3 ...

  6. 使用git bash向github远程仓库提交代码

    1.登录github,创建仓库. 2.切换到要提交的文件目录下. 3.打开git bash 3.1.初始化仓库 git init 3.2.将本地仓库与远程仓库关联 git remote add ori ...

  7. HBase行键的设计

    rowkey是行的主键,而且hbase只能用rowkey范围即scan来查找数据.rowkey是以字典排序的.可以巧妙设计行键,比如想通过电影的评价进行排序,可以把评分rate和电影id组合起来,ra ...

  8. NSThread/NSOperation/GCD 三种多线程技术

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ...

  9. 开启我的PHP学习之旅

    第二课 LAMP: Linux apache ngix PHP 第三课 搭建server方式: 1.集成安装环境 XAMPP软件包:www.apachefriends.org 2.单独配置 第四课 X ...

  10. UNIX环境高级编程之第3章:文件I/O

    3.1 引言 文件I/O函数:打开文件,读文件,写文件 经常使用到五个函数:open, read, write, lseek, close. 本章描写叙述的函数都是:不带缓冲的I/O(unbuffer ...