熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET應用中緩存Oracle數據[2]

2022-06-13   來源: .NET編程 

ASPNET TierVBNET實現

 

我們設計了含一個回調方法的監聽類來處理緩存項無效時的通知這個回調方法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)對象所有者

 

begin administratorplfile(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部署

[]  []  


From:http://tw.wingwit.com/Article/program/net/201311/15139.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.