ASP.NET 2.0实现依赖Oracle的缓存策略
2008-11-07 17:45
513 查看
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。
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文件中。
三、测试
前面两步完成后,依赖Oracle的缓存策略就设置好了。只要DEPT表中的数据更改后,触发器就会修改TextFile.txt文件中的内容,TextFile.txt文件一被修改,缓存中的页面就自动失效了,再次访问页面时,请求就会发给服务器,来重新生成页面。
在Visual Studio 2005中调试程序,不断刷新打开的Default.aspx页面,页面显示的时间每隔120秒,才会发生变化一次。这是因为设置的缓存过期时间为120秒。这时,只要我们手工修改SCOTT用户的DEPT表中的数据后,再次刷新页面时,页面上显示的时间马上就会发生变化。这说明我们设置的依赖Oracle的缓存策略成功了。
===============================
Sql Server也可以采用这种机制进行:
其实不用着急,因为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); } |
二、在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的缓存策略成功了。
===============================
Sql Server也可以采用这种机制进行:
|
相关文章推荐
- ASP.NET 2.0实现依赖Oracle的缓存策略
- ASP.NET 2.0实现依赖Oracle的缓存策略
- ASP.NET 2.0 中使用自定义缓存依赖
- asp.net 2.0 + sqlserver2005 数据依赖缓存
- ASP.NET Cache 实现依赖Oracle的缓存策略
- ASP.NET 2.0 中使用自定义缓存依赖
- ASP.NET下使用xml反序列化、缓存依赖实现个性化配置文件的实时生效
- asp.net 2.0 使用sqlserver2005 新的通知数据缓存实现
- asp.net 实现文件缓存依赖,数据库缓存依赖
- 在ASP.NET 2.0中操作数据之五十九:使用SQL缓存依赖项SqlCacheDependency
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十二) 代码重构使用反射工厂解耦(一)缓存切换
- ASP.NET Boilerplate 学习 AspNet Core2 浏览器缓存使用 c#基础,单线程,跨线程访问和线程带参数 wpf 禁用启用webbroswer右键菜单 EF Core 2.0使用MsSql/MySql实现DB First和Code First ASP.NET Core部署到Windows IIS QRCode.js:使用 JavaScript 生成
- cache应用(asp.net 2.0 SQL数据缓存依赖 [SqlCacheDependency ] )
- cache应用(asp.net 2.0 + sqlserver2005 数据依赖缓存 )
- 使用ASP.NET 2.0 输出缓存替换的功能实现Donut Caching
- asp.net 2.0 + sqlserver2005 数据依赖缓存
- asp.net 实现文件缓存依赖,数据库缓存依赖
- 技巧和诀窍:使用ASP.NET 2.0 输出缓存替换的功能实现“甜圈缓存(Donut Caching)”
- asp.net 2.0 使用sqlserver2005 新的通知数据缓存实现