成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

ASP.NET應用中緩存Oracle數據

瀏覽:176日期:2023-10-27 12:58:18
作者:;夢可,; 出處:ITPUB為了創建可擴展、高性能的基于WEB的應用,ASP.NET提供一個稱為數據緩存(Data;Caching)的特性。數據緩存支持將頻繁訪問的數據對象可編程地存放在內存中。這一特性可擴展以廣泛地提高查詢Oracle數據庫中數據的ASP.NET應用的性能。本文講述一個策略,可用于采用Web;Farm環境中的ASP.NET;Web應用緩存Oracle數據庫數據。為了創建可擴展、高性能的基于WEB的應用,ASP.NET提供一個稱為數據緩存(Data;Caching)的特性。數據緩存支持將頻繁訪問的數據對象可編程地存放在內存中。這一特性可擴展以廣泛地提高查詢Oracle數據庫中數據的ASP.NET應用的性能。本文講述一個策略,可用于采用Web;Farm環境中的ASP.NET;Web應用緩存Oracle數據庫數據。這個技巧允許在內存中緩存頻繁訪問的Oracle數據庫數據,而不是頻繁訪問數據庫來取數據。這可以幫助避免到Oracle數據庫服務器的不必要的遠路。進一步的,文章提出了一個保持緩存數據以使其始終與Oracle數據同步的實現。ASP.NET中的數據緩存ASP.NET中的數據緩存由Cache類和System.Web.Caching命名空間中的CacheDependency類支持。Cache類提供向緩存插入和從中取出數據的方法。CacheDependency類允許為緩存中數據項的指定其依賴項。當我們用Insert和Add方法將項目加入緩存中,可以指定一個項目的過期(expiration)策略。我們可以用Insert方法的absoluteExpiration屬性來定義緩存中一個項目的生命期。這個屬性允許你指定相應數據項過期的準確時間。也可以使用slidingExpiration屬性來指定項目過期的流逝時間(基于它被訪問的時間)。一旦一個項目過期,它從緩存中被清除。除非它再次被加入緩存中,否則再試圖訪問,將返回一個空值。設定緩存依賴ASP.NET使我們可以基于一個外部文件、目錄或另一個緩存項來定義一個緩存項的依賴,即所謂文件依賴與鍵依賴。若一個依賴項改變,緩存項自動失效并被從緩存中清除。當相應的數據源改變時,我們可以用這種方法來從緩存中刪除項目。例如,若我們的應用從一個XML文件中取數據并顯示在一個表格(grid)中,我們可以把文件中的數據存放到緩存中,并設定緩存依賴于那個XML文件。當XML文件被更新,數據項就從緩存中被清除出去。這一事件發生時,應用重新讀入XML文件,最新的數據項副本被再一次插入緩存中。進一步的,回調事件處理器可被設定為一個監聽者,當緩存項被刪除時得到通知。這使得我們不需要反復輪詢緩存來確定數據項是否已無效。Oracle數據庫上的ASP.NET緩存依賴現在考慮這樣一個情景:數據存放于Oracle數據庫中,一個ASP.NET應用通過ADO.NET來訪問。進一步,我們假設數據庫表中的數據一般是靜態的,并被這個Web應用頻繁訪問。表上的DML操作很少而對數據有很多Select。這種情況是數據緩存技術的理想應用。但不幸的是,ASP.NET并不允許設定一個緩存項依賴于存放在數據庫表中的數據。進一步,現實世界中,基于Web的系統,Web服務器和Oracle數據庫服務器總是會運行在不同的機器上,使得緩存無效操作更有挑戰性。另外,多數基于Web的應用采用Web;farms,同一個應用的實例在不同的Web服務器上跑以負載均衡。這種情況使得數據庫緩存問題稍稍復雜一些。為了進一步研究上述問題的解決方案,我們舉一個Web應用的例子來說明如何實現。例子中,我們使用VB.NET實現的ASP.NET應用,通過Oracle;Data;Provider;for;.NET;(ODP)來訪問;Oracle;9i數據庫。這個例子使用Oracle數據庫中一個名為Employee的表。我們為該表上insert,;update,;delete設定觸發器。這些觸發器調用一個封裝了一個Java存儲過程的PL/SQL函數。這個Java存儲過程負責更新緩存依賴的文件。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 Trycon;=;getDatabaseConnection(;"UserId=scott;Password=tiger;Data;Source=testingdb;")cmd;=;New;OracleCommand("Administrator.getEmployee",;con)cmd.CommandType;=;CommandType.StoredProcedurecmd.Parameters.Add(New;OracleParameter("employeeId",;OracleDbType.Int64)).Value;=;p_empidDim;param;AsNew;OracleParameter("RC1",;OracleDbType.RefCursor)cmd.Parameters.Add(param).Direction;=;ParameterDirection.OutputDim;myCommand;AsNew;OracleDataAdapter(cmd)ds;=;New;DataSetmyCommand.Fill(ds)Dim;table;As;DataTable;=;ds.Tables(0)Dim;index;As;Int32;=;table.Rows.CountReturn;ds.Tables(0).DefaultView Catch;ex;As;ExceptionThrowNew;Exception("Exception;in;Database;Tier;Method;getRecordFromdatabase;();";+;ex.Message,;ex) FinallyTry cmd.Dispose()Catch;ex;As;ExceptionFinally cmd;=;NothingEndTryTry con.Close()Catch;ex;As;ExceptionFinally con;=;NothingEndTry EndTryEndFunction;函數getDatabaseConnection接受一個連接字符串(connection;stirng)為參數,返回一個OracleConnection對象引用。PublicFunction;getDatabaseConnection(ByVal;strconnection;as;string);As;OracleConnection Dim;con;As;Oracle.DataAccess.Client.OracleConnection;=;Nothing Trycon;=;New;Oracle.DataAccess.Client.OracleConnectioncon.ConnectionString;=;strconnectioncon.Open()Return;con Catch;ex;As;ExceptionThrowNew;Exception("Exception;in;Database;Tier;Method;getOracleConnection();"+;ex.Message,;ex) EndTryEndFunction;;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;JAVANAME;'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部署。
標簽: Oracle 數據庫
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美性极品少妇| 成人午夜在线播放| 国产精品一二三| 欧美偷拍一区二区| 日本不卡在线视频| 六月婷婷久久| 成人精品在线视频观看| 日韩一级二级三级| 麻豆传媒一区二区三区| 色欧美日韩亚洲| 日本不卡在线视频| 91久久精品一区二区三区| 日韩电影一区二区三区四区| 久久久久久九九九九| 天天综合网天天综合色| 久久精品系列| 视频一区视频二区中文| 久久久久久久久久久久久久一区 | 国产精品高潮呻吟久久| 91在线国产福利| 日韩久久精品一区| 成人app软件下载大全免费| 日韩免费一区二区三区在线播放| 国产久卡久卡久卡久卡视频精品| 欧美一级高清片| 成人国产精品免费网站| 国产三级一区二区| 国产在线视频欧美一区二区三区| 国产精品免费丝袜| 在线观看一区欧美| 亚洲免费毛片网站| 亚洲欧洲日本mm| 一区二区三区日韩| 久久xxxx精品视频| 美国十次了思思久久精品导航| 欧美性色黄大片手机版| 国产在线一区观看| 精品三级av在线| 国产精品成人一区二区网站软件| 国产精品久久99| 伊人久久久大香线蕉综合直播| 亚洲精品一二三区| 午夜综合激情| 麻豆视频观看网址久久| 7799精品视频| 91论坛在线播放| 亚洲欧美综合色| 国产精品欧美久久| 三级久久三级久久久| 欧美写真视频网站| av中文字幕亚洲| 亚洲视频在线一区二区| 国产精品久久久久毛片软件| 国产伦精品一区二区| 美女一区二区久久| 久久综合九色综合欧美98| 欧美精品在线一区| 亚洲一区二区视频在线| 欧美日韩高清一区二区不卡 | 成人高清视频在线| 久久精品日韩一区二区三区| 国产中文一区二区| 日韩精品午夜视频| 欧美v亚洲v综合ⅴ国产v| 在线免费观看欧美| 亚洲成人激情综合网| 欧美日韩免费观看一区二区三区| 99精品视频在线观看免费| 亚洲九九爱视频| 91麻豆精品国产91久久久| 欧美午夜精彩| 日韩在线一区二区| 亚洲精品一区二区三区福利 | 欧美私人啪啪vps| 欧美久久久久久久久久| 午夜免费电影一区在线观看| 亚洲综合精品久久| 777欧美精品| 国产精品豆花视频| 美日韩黄色大片| 久久精品一区蜜桃臀影院| 亚洲高清av| 激情文学综合网| 国产精品久久网站| 欧美性一区二区| 欧美国产日本| 日韩中文欧美在线| 久久在线免费观看| 色婷婷香蕉在线一区二区| av在线一区二区三区| 亚洲国产日韩综合久久精品| 欧美一级搡bbbb搡bbbb| 一本色道久久综合| 国产91精品久久久久久久网曝门| 亚洲精品视频在线| 欧美一区二区三区在线看| 亚洲精品在线观看免费| 成人精品亚洲人成在线| 亚洲444eee在线观看| 久久只精品国产| 久久综合九色综合欧美狠狠| 99热精品国产| 日本美女一区二区三区| 成人午夜电影网站| 午夜久久久久久久久| 国产人成一区二区三区影院| 91国产福利在线| 欧美日本高清| 国精品**一区二区三区在线蜜桃 | 精品一区二区三区的国产在线播放| 国产精品日韩精品欧美在线| 欧美日韩一区二区三区免费看 | 99热免费精品| av在线综合网| 老司机免费视频一区二区 | 亚洲欧美激情小说另类| 欧美一卡2卡三卡4卡5免费| 国产精品一区免费观看| 午夜精品偷拍| 国产剧情在线观看一区二区| 亚洲大片在线观看| 日本一区二区电影| 欧美一区二区观看视频| 麻豆av福利av久久av| 很黄很黄激情成人| 成人免费黄色大片| 美女视频网站黄色亚洲| 亚洲激情网站免费观看| 国产日韩精品一区| 3atv一区二区三区| 色诱亚洲精品久久久久久| 亚洲精品在线视频观看| 91免费版在线看| 国产成人欧美日韩在线电影| 日韩激情av在线| 亚洲免费三区一区二区| 国产亚洲精品超碰| 日韩区在线观看| 欧美视频在线播放| 麻豆亚洲精品| 在线一区日本视频| 亚洲婷婷在线| 99re热视频这里只精品| 国产精品一二三四区| 视频一区国产视频| 亚洲免费观看高清在线观看| 欧美国产一区在线| 久久午夜羞羞影院免费观看| 91精品国产综合久久福利软件 | 亚洲一本大道在线| 国产精品第一页第二页第三页 | 日韩不卡一区二区三区 | 日韩激情中文字幕| 午夜私人影院久久久久| 洋洋av久久久久久久一区| 亚洲女同一区二区| 亚洲同性gay激情无套| 亚洲高清在线观看一区| 狠狠爱www人成狠狠爱综合网| 91蜜桃视频在线| 91在线视频网址| 99久久免费精品高清特色大片| 成人开心网精品视频| 国产99精品国产| 国产91精品免费| 高清beeg欧美| 成人免费黄色在线| 国产成人av电影免费在线观看| 狠狠色丁香婷综合久久| 激情深爱一区二区| 狠狠色丁香久久婷婷综| 国内精品伊人久久久久av一坑| 精品一区二区三区在线观看| 免费久久99精品国产| 日本系列欧美系列| 婷婷久久综合九色国产成人| 首页亚洲欧美制服丝腿| 日韩国产欧美在线观看| 日本不卡一二三| 久久激情五月激情| 免费日本视频一区| 国产伦精品一区二区三区视频青涩 | 国产精品一二三四五| 国产成人综合自拍| 成人妖精视频yjsp地址| bt7086福利一区国产| 91美女片黄在线| 日本欧洲一区二区| 久草热8精品视频在线观看| 狠狠狠色丁香婷婷综合久久五月| 黑人巨大精品欧美一区| 国产jizzjizz一区二区| 9人人澡人人爽人人精品| 色综合天天性综合| 黄色国产精品| 亚洲综合欧美| 色呦呦一区二区三区| 91麻豆精品国产91久久久久久 | aa级大片欧美三级| 美女黄色成人网|