asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

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


发布日期:2021年02月21日
 
ASP.NET应用中缓存Oracle数据[2]

ASPNET Tier的VBNET实现

我们设计了含一个回调方法的监听类来处理缓存项无效时的通知这个回调方法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()

CacheInsert(employeeTable Source New

SystemWebCachingCacheDependency(d:\download\tblemployeetxt)

CacheNoAbsoluteExpiration CacheNoSlidingExpiration

CacheItemPriorityNormal onRemove)

EndSub

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

PublicFunction getRecordFromdatabase (ByVal p_empid As Int) 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(AdministratorgetEmployee con)

cmdCommandType = CommandTypeStoredProcedure

cmdParametersAdd(New OracleParameter(employeeId OracleDbTypeInt))Value = p_empid

Dim param AsNew OracleParameter(RC OracleDbTypeRefCursor)

cmdParametersAdd(param)Direction = ParameterDirectionOutput

Dim myCommand AsNew OracleDataAdapter(cmd)

ds = New DataSet

myCommandFill(ds)

Dim table As DataTable = dsTables()

Dim index As Int = tableRowsCount

Return dsTables()DefaultView

Catch ex As Exception

ThrowNew Exception(Exception in Database Tier Method getRecordFromdatabase () + exMessage ex)

Finally

Try

cmdDispose()

Catch ex As Exception

Finally

cmd = Nothing

EndTry

Try

conClose()

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 OracleDataAccessClientOracleConnection = Nothing

Try

con = New OracleDataAccessClientOracleConnection

conConnectionString = strconnection

conOpen()

Return con

Catch ex As Exception

ThrowNew Exception(Exception in Database Tier Method getOracleConnection()

+ exMessage ex)

EndTry

EndFunction

Oracle数据库Tier实现

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

beginadministratorplfile(machine \\download\\ tblemployeetxt);administratorplfile(machine\\download \\ tblemployeetxt);end;

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

import javaio*;public class UpdFile {public static void updateFile(String filename) {try {File f = new File(filename);fdelete();fcreateNewFile();}catch (IOException e){// log exception}};

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

(p_filename IN VARCHAR)

AS LANGUAGE JAVA

NAME UpdFileupdateFile (javalangString);

Web Farm部署中的Oracle数据缓存

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

结论

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

[] []

               

上一篇:不走寻常路 设计ASP.NET应用程序的七大绝招[2]

下一篇:细节决定成败 ASP.NET中的蝴蝶效应