你的位置:睿鑫网络 >> 编程 >> web开发 >> ASP.NET >> 详细内容 在线投稿

ASP.NET 2.0实现依赖Oracle的缓存策略

排行榜 收藏 打印 发给朋友 举报 来源: 网络   发布者:未知
热度16票  浏览49次 时间:2010年1月15日 10:55
睿鑫网络!\(R6H u:u(\Qyx

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

F9`4T%YDcU0 睿鑫网络#n^m"D:E|"EA$Ue0n

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

"K0QX*\3o_HLI0

(\+x ~aK4c0下面以一个小例子来具体说明:睿鑫网络0?IRxX Q

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

7Q7MC:H0Q&H R"@0 睿鑫网络h,z%H'E(Mq

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

"Y)??(k-gk F0

Z+@7Kb#r+U8~'A01.打开Visual Studio 2005,在E:\CSharp\CacheByOracleDependncy目录下新建一个WEB项目,在其Default.aspx页面上添加一个Label控件,显示页面生成的时间,以判断刷新时页面是否为重新生成的,并设置页面缓存依赖于文件E:\CSharp\CacheByOracleDependncy\TextFile.txt。睿鑫网络n}?%vam`$wM

oBA,W([R\i0protected void Page_Load(object sender, EventArgs e)睿鑫网络'\h G8syy3S

睿鑫网络/rTl^([6Vb6p

{睿鑫网络+J3m]3n2EXz4p

-io.Z'z)v0 //显示当前时间,以便判断是否为缓存中页面

w ey6P7b0 睿鑫网络+`w~ id&]-E

 this.Label1.Text = "CacheByOracleDependency:" + DateTime.Now.ToString();睿鑫网络 lPM}:K1Z

7a|x5t|)w"c(xb C0 //缓存依赖于文件TextFile.txt睿鑫网络 M#\^dPg_5u^v

w0w YpH;X%a0 string fileDependencyPath = Server.MapPath("TextFile.txt");

)ql2XG;O^ ]0 睿鑫网络(Lb"{(] ?(_

 Response.AddFileDependency(fileDependencyPath);睿鑫网络 ]q j lek]NW

睿鑫网络8y%fF ~b y

 // 设置缓存的过期时间为120秒。睿鑫网络?0BVmTy-G \cZ/A

睿鑫网络r5Fp&z:~un{l

 Response.Cache.SetExpires(DateTime.Now.AddSeconds(120));睿鑫网络*x Z)kq3O;m.JV9o

&NRBn m|@X0s [0 Response.Cache.SetCacheability(HttpCacheability.Public);睿鑫网络mA#Ck"r.jw]

6jEV#D-cG0 Response.Cache.SetValidUntilExpires(true);睿鑫网络;}CP!swp2Btx[

UdomYy0}睿鑫网络wG0K*O!fg

睿鑫网络2\6BiI^3BnD rI

2.在E:\CSharp\CacheByOracleDependncy目录下新建一个TextFile.txt文件。睿鑫网络\fR Z*J*r

睿鑫网络 j7N%Zt R U:G Y

二.在Oracle数据库中创建触发器睿鑫网络}M)n&m9d~c

K7re+f(f01.触发器被触发时执行PL/SQL代码块。PL/SQL代码块直接读写操作系统中的文件,需调用内置的utl_file程序包。这需要先修改Oracle的初始化参数文件INIT.ORA,在其中添加参数utl_file_dir,来指定文件的目录。修改INIT.ORA文件后,需重启Oracle数据库,设置的参数才能生效。

1k.eir%BS2Lzml0 睿鑫网络-]3f]9y"{)YG#`1@-@

在INIT.ORA文件中添加下面一行内容:睿鑫网络h%p'@ai

n } n6a$[g0utl_file_dir='E:\CSharp\CacheByOracleDependncy'睿鑫网络TM8xrH.he

6X@ IWaEs!xX ]E0也可以设置为utl_file_dir=*,不指定具体目录,即任何目录都可以。

kV(Q2@)`FW6X9I0

n"{x%Z-g u.Sg&r h0如果是Oracle 9i数据库,还有一种方法也能起到同样的作用:在sys用户下创建一个directory目录(实际上是在sys用户下的dir$表中增加一个对应的OS_PATH),然后将对该directory对象的读/写操作的权限grant给public。

r,r B(W gN"A0 睿鑫网络$j I1tY!j$@YG

create or replace directory FILEPATH as 'E:\CSharp\CacheByOracleDependncy';睿鑫网络x"uF rD

:q#P3n-e q\CQ0grant read on directory FILEPATH to public;

4l'M1\ PH?$`ux,@ L0

*n5\-Y$F.f+V K1u0这里我使用的是第二种方法。睿鑫网络8u~ cHb }x"R"G

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

:aC [y/or T0

3|LG&e?v6c0CREATE OR REPLACE TRIGGER

]l$T,z O-Rh D0

5DsALz8qD2@0"SCOTT"."TEST_CACHE_BY_ORACLE_DEPENDNCY" AFTER睿鑫网络&])ZI/^w D6m

睿鑫网络 vR1KIZ[2_z

INSERT睿鑫网络u X N%O s8c5v

睿鑫网络}Zzt o$B i$~8hM

OR UPDATE

(o!pjF#d6N g!H:N0

4_'C Xna1Px nJ0OR DELETE OF "DEPTNO", "DNAME", "LOC" ON "SCOTT"."DEPT" DECLARE睿鑫网络i5kVDqe

S0nav J/X c?r3A!x x/^0file_handle utl_file.file_type;

(R} J)[S&X"n0 睿鑫网络3Z}b"I;p"v

BEGIN

eXqJ'n!tS&H0 睿鑫网络3vjm{,~

--打开文件睿鑫网络vz wG;b ?9s

睿鑫网络P T+l^X9pN.H|

file_handle := utl_file.fopen('FILEPATH','TextFile.txt','w');

ZP@%T_?.Q:I0

x Iw9l,B? U0--将当前系统时间写入文件睿鑫网络u v\4E%Aa:h"u X:MM

/A:C&?x6K;nR:^0IF utl_file.is_open(file_handle) THEN睿鑫网络;\ a'x0\ga3O

s)t_t'b U0Kq0 utl_file.put_line(file_handle,to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss'));睿鑫网络-n#F*K:Q}"o$rbz8y

睿鑫网络x Xi+iU(oUt-]

END IF;

V(Q"fr9Z(pLQ0 睿鑫网络m$YBBj"y

--关闭文件睿鑫网络#o8jxV.s8q0c0x

睿鑫网络eC*]~ A}3@&C~

utl_file.fclose(file_handle);睿鑫网络3r.r1H"@F q&CPK

睿鑫网络5rc1YbHN?6[

EXCEPTION

~5r)@Kfg^0 睿鑫网络j~ Z:n7Yq6[\6b(U

WHEN OTHERS THEN

9k,`]2u7V.|Oz+~0

uV!S'O J;xJB0BEGIN睿鑫网络+Y.WmI1Aq V!K4R

Q rBK/B,e/q_e"u0 IF utl_file.is_open(file_handle) THEN睿鑫网络J'JS4M%g(X,Tkr0}

2j ^l X#~/e;B-H0utl_file.fclose(file_handle);睿鑫网络;o+?Qm7sgQ*r!] z&k

w(m:`'z"P9c/np+Mn.k0 END IF;睿鑫网络"{G4W] [w)rg7xD

睿鑫网络q#s5N4A)t~ N0ZL

EXCEPTION睿鑫网络r.E-P V)R'KF4`]4m

睿鑫网络+I$ya1A7uoi

 WHEN OTHERS THEN

9v!UO2uYeu0 睿鑫网络'H_m$L_@6S0d

NULL;睿鑫网络w6X4N3kDJ3|

睿鑫网络8W ydc;GYE m

 END;

D8n'b.D,v4tK0

qJhx]dOAd0END;

Wb-]'d5oQ8Z"I9_ch*A0

Hu v%lu.XVgR0三.测试睿鑫网络"v9C.fB X

睿鑫网络6m A'`eov

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

1KQ.W3s]0

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

Z9t u4t-_(qk)V0
上一篇 下一篇

网络资源