安全中国首页 > 编程中心 > .NET编程
 
安全中国网友投稿专用上传FTP空间:
Ftp服务器:download.anqn.com
Ftp端口:21
用户名:anqn
密 码:anqn.com
 

ASP.NET应用中缓存Oracle数据[2]

更新时间:2008-7-29 15:10:37
责任编辑:ShellExp
热 点:

ASP.NET Tier的VB.NET实现

 

我们设计了含一个回调方法的监听类来处理缓存项无效时的通知。这个回调方法RemovedCallback用一个代理(delegate)函数来注册。回调方法onRemove的声明必须与CacheItemRemovedCallback代理声明又相同的签名。

 

  Dim onRemove As CacheItemRemovedCallback = Nothing

onRemove = New CacheItemRemovedCallback(AddressOf RemovedCallback)

 

监听事件处理方法RemovedCallback负责处理数据库触发器的通知,其定义如下。若缓存项失效,可用数据库方法调用 getRecordFromdatabase()从数据库取出数据。参数”key”指从缓存中删除的项的索引位置。参数”value”指从缓存中删除的数据对象。参数"CacheItemRemovedReason"指从缓存中删除数据项的原因。

 

  PublicSub RemovedCallback(ByVal key AsString, ByVal value AsObject, ByVal reason As

  CacheItemRemovedReason)

  Dim Source As DataView

  Source = getRecordFromdatabase()

  Cache.Insert("employeeTable ", Source, New

  System.Web.Caching.CacheDependency("d:\download\tblemployee.txt"),

  Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,

  CacheItemPriority.Normal, onRemove)

EndSub

 

方法getRecordFromdatabase()负责查询数据库表Employee并返回一个DataView对象引用。它使用一个名为 getEmployee的存储过程来抽象从Employee表中取数据的SQL。这个方法有一个名为p_empid的参数,表示Employee的主键。

 

  PublicFunction getRecordFromdatabase (ByVal p_empid As Int32) As DataView

  Dim con As OracleConnection = Nothing

  Dim cmd As OracleCommand = Nothing

  Dim ds As DataSet = Nothing

  Try

  con = getDatabaseConnection( "UserId=scott;Password=tiger;Data Source=testingdb;")

  cmd = New OracleCommand("Administrator.getEmployee", con)

  cmd.CommandType = CommandType.StoredProcedure

  cmd.Parameters.Add(New OracleParameter("employeeId", OracleDbType.Int64)).Value = p_empid

  Dim param AsNew OracleParameter("RC1", OracleDbType.RefCursor)

  cmd.Parameters.Add(param).Direction = ParameterDirection.Output

  Dim myCommand AsNew OracleDataAdapter(cmd)

  ds = New DataSet

  myCommand.Fill(ds)

  Dim table As DataTable = ds.Tables(0)

  Dim index As Int32 = table.Rows.Count

  Return ds.Tables(0).DefaultView

  Catch ex As Exception

  ThrowNew Exception("Exception in Database Tier Method getRecordFromdatabase () " + ex.Message, ex)

  Finally

  Try

  cmd.Dispose()

  Catch ex As Exception

  Finally

  cmd = Nothing

  EndTry

  Try

  con.Close()

  Catch ex As Exception

  Finally

  con = Nothing

  EndTry

  EndTry

EndFunction

 

函数getDatabaseConnection接受一个连接字符串(connection stirng)为参数,返回一个OracleConnection对象引用。

 

  PublicFunction getDatabaseConnection(ByVal strconnection as string) As OracleConnection

  Dim con As Oracle.DataAccess.Client.OracleConnection = Nothing

  Try

  con = New Oracle.DataAccess.Client.OracleConnection

  con.ConnectionString = strconnection

  con.Open()

  Return con

  Catch ex As Exception

  ThrowNew Exception("Exception in Database Tier Method getOracleConnection() "

  + ex.Message, ex)

  EndTry

EndFunction

 

Oracle数据库Tier实现

 

定义Employee表上DML事件的触发器体如下。这个触发器简单的调用一个PL/SQL包裹函数来更新名为tblemployee.txt的操作系统文件。文件副本在两台机器(机器1和机器2)上更新。两台机器运行同一个Web应用的不同实例来均衡负载。这里administrator指 Oracle数据库的方案(schema)对象所有者。

 

begin administrator.plfile('machine1 \\download\\ tblemployee.txt'); administrator.plfile('machine2\\download \\ tblemployee.txt');end;

 

为更新缓存依赖文件,我们需要写一个C函数或Java存储过程。我们的例子中选择了Java存储过程,因为Oracle数据库服务器有一个内置的JVM,使得书写Java存储过程很方便。必须有足够的内存分配给Oracle实例的系统全局区(SGA)中的Java池。静态方法updateFile接受一个绝对路径作为参数,并在合适的目录中创建缓存依赖文件。若文件已经存在,则先删除然后创建。

 

import java.io.*;public class UpdFile {public static void updateFile(String filename) { try {  File f = new File(filename);  f.delete();  f.createNewFile(); } catch (IOException e) {  // log exception }};

 

NPL/SQL包裹实现如下。包裹函数以文件名为参数,调用Java存储过程中updateFile方法。

 

  (p_filename IN VARCHAR2)

  AS LANGUAGE JAVA

NAME 'UpdFile.updateFile (java.lang.String)';

 

Web Farm部署中的Oracle数据缓存

 

正如我们讨论的例子中所示,Web服务器1和机器2构成了一个Web Farm来为我们的Web应用提供负载均衡。每台机器运行同一个Web应用的一个实例。在这个情况下,每个实例可以拥有自己的存放在Cache对象中的缓存数据副本。当Employee表改变,相应的数据库触发器更新两台机器上的文件 tblemployee.txt。每个实例都指定一个到tblemployee.txt的缓存依赖,Web Farm的两个实例都可以正确更新,使得两个实例上的数据缓存可以和数据库表Employee保持同步。

 

结论

 

  数据缓存是优化Oracle数据库上 ASP.NET应用的有效技巧。尽管ASP.NET不允许设定缓存的数据库依赖,Oracle触发器协同Java存储过程可以扩展ASP.NET缓存的威力从而允许Oracle数据库缓存。这个技巧也可以适用于Web Farm部署。

 
学习软件编程开发技术,推荐加入以下软件编程培训班:
易语言软件编程培训班(简单易学)  Delphi软件编程培训班  VC++软件编程培训班
VB软件编程培训班  JAVA高端编程就业研发班

学习网站开发制作技术,推荐加入以下网站开发培训班:
ASP.net网站开发项目实战班  ASP语言网站建设培训班

学习网络安全入侵防护技术,推荐加入以下技术培训班:
大型网络安全入侵防护班  网站脚本程序全方位安全检测班

学习网络管理、网吧运营维护技术(网管),推荐加入以下培训班:
大型网吧技术管理人才特训班  Linux网络嵌入架构工程师培训班

学习专项特殊技术,推荐加入以下专项技术培训班:
软件与游戏外挂脱壳破解班(逆向工程)  赚钱王道-网赚技能培训班  Flash动画设计师就业特训班

 
相关编程
一日一文章
 
一日一软件
一日一动画