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)對象所有者
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