为ASP.NET应用缓存Oracle数据(2)
点击次数:23 次 发布日期:2008-11-26 13:48:26 作者:源代码网
|
源代码网推荐 源代码网推荐 我们设计了含一个回调方法的监听类来处理缓存项无效时的通知。这个回调方法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 blemployee.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 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 }; 源代码网推荐 源代码网推荐 PL/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部署。 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
