狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频

當前位置:系統之家 > 技術開發教程 > 詳細頁面

為ASP.NET應用緩存Oracle數據

為ASP.NET應用緩存Oracle數據

更新時間:2019-08-21 文章作者:未知 信息來源:網絡 閱讀次數:

原作:Narayan Veeramani

時間:12/29 /2003

為了創建可擴展、高性能的基于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

 

      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部署。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频
91行情网站电视在线观看高清版| 久久综合九色综合久99| 一本色道久久综合亚洲精品按摩| 欧美一区二区三区四区在线观看| 中文字幕av在线一区二区三区| 午夜成人免费电影| 国产ts人妖一区二区| 亚洲激情一区二区三区| 欧美日韩在线综合| 国产精品乱码久久久久久| 日本欧美一区二区| 欧美一区91| 91久久精品一区二区| 久久久久久久电影| 三级亚洲高清视频| 色综合色狠狠综合色| 色狠狠综合天天综合综合| 国产亚洲视频系列| 日本强好片久久久久久aaa| 色综合天天性综合| 欧美性猛交xxxx黑人交| 国产日韩欧美电影| 麻豆高清免费国产一区| 欧美区亚洲区| 欧美日韩的一区二区| 国产精品国产三级国产aⅴ中文 | 五月天丁香久久| 91啪九色porn原创视频在线观看| 久久婷婷av| 日本一区二区成人在线| 精品写真视频在线观看| 亚洲精品日韩久久| 日韩一级黄色片| 亚洲五月六月丁香激情| 91麻豆免费在线观看| 精品视频一区二区不卡| 亚洲精品国产一区二区三区四区在线| 粉嫩av一区二区三区粉嫩| 亚洲欧美电影在线观看| 亚洲国产精品精华液ab| 国产在线播精品第三| 国产一区二区精品| 国产亚洲综合在线| 国内不卡的二区三区中文字幕 | 亚洲第一毛片| 欧美精品一区二区久久久| 人人狠狠综合久久亚洲| 伊人狠狠色j香婷婷综合| 日韩精品中午字幕| 蜜臀av性久久久久蜜臀aⅴ| 亚洲高清久久| 久久久久久日产精品| 国产在线一区观看| 久久免费黄色| 亚洲手机成人高清视频| av在线播放成人| 欧美日韩亚洲另类| 午夜天堂影视香蕉久久| 伊人久久亚洲影院| 久久久久久免费毛片精品| 国产毛片精品一区| 一本大道久久a久久精二百| 亚洲另类色综合网站| 午夜精品一区二区在线观看| 日韩一二三区视频| 久久99久国产精品黄毛片色诱| 国产精品最新自拍| 中文字幕五月欧美| 91免费看视频| 日韩欧美一级二级| 国产一区二区91| 欧洲一区二区三区免费视频| 亚洲国产日日夜夜| 99精品国产在热久久| 国产精品激情偷乱一区二区∴| 99久久综合精品| 日韩欧美一二三| 国产剧情一区二区| 久久er精品视频| 久久精品五月| 亚洲一区二区美女| av成人激情| 亚洲日本欧美天堂| 极品中文字幕一区| 国产精品视频一区二区三区不卡| 99re8在线精品视频免费播放| 日韩欧美亚洲国产另类| 国产精品一卡二卡在线观看| 欧美日韩高清一区| 国内精品写真在线观看| 欧美三级乱人伦电影| 奇米四色…亚洲| 色综合久久88色综合天天6| 亚洲成人动漫一区| 香蕉精品999视频一区二区| 一区二区激情视频| 一本色道久久综合一区| 亚洲精品国产第一综合99久久| 亚洲精品乱码| 一区二区视频免费在线观看| 99在线精品视频在线观看| 亚洲美女少妇撒尿| 国产精品乱码一区二区三区| 亚洲一区二区三区在线播放| 国产一区二区三区免费不卡 | 韩国av一区二区三区在线观看| 精品视频1区2区| 国产精品主播直播| 日韩视频一区二区三区在线播放| 国产大陆a不卡| 精品sm在线观看| 欧美暴力喷水在线| 国产精品久久久久久久午夜片| 最新亚洲一区| 亚洲图片欧美综合| 久久久福利视频| 久久精品国产77777蜜臀| 欧美福利一区二区| 成人亚洲精品久久久久软件| 久久男人中文字幕资源站| 午夜久久一区| 亚洲欧美国产高清| 性8sex亚洲区入口| 麻豆91精品视频| 3d成人h动漫网站入口| 成人动漫一区二区三区| 国产欧美日韩激情| 91久久精品一区二区别| 亚洲电影中文字幕在线观看| 在线视频你懂得一区二区三区| 极品销魂美女一区二区三区| 日韩亚洲国产中文字幕欧美| 色综合天天综合给合国产| 自拍偷拍国产亚洲| 麻豆九一精品爱看视频在线观看免费| 奇米777欧美一区二区| 欧美一区二区三区小说| 牛夜精品久久久久久久99黑人| 亚洲欧美色综合| 色先锋aa成人| 国产成a人无v码亚洲福利| 国产日韩av一区| 亚洲色诱最新| 久久超级碰视频| 精品av综合导航| 亚洲成人tv网| 91黄色在线观看| 成人午夜免费视频| 国产精品不卡在线观看| 久久精品二区三区| 国产精品一区二区免费不卡| 国产女人18毛片水真多成人如厕| 国产日韩视频| 国产在线精品免费| 久久精品在线免费观看| 国产精品久久久久久久久婷婷 | 永久域名在线精品| 美女高潮久久久| 久久婷婷成人综合色| 亚洲久久视频| 国内外精品视频| 国产精品日韩精品欧美在线| 久久精品中文字幕一区二区三区| 国产精品538一区二区在线| 国产精品久久久久久亚洲伦| 91久久精品国产91性色tv | 国产乱人伦精品一区二区| 国精产品一区一区三区mba视频| 国产精品色噜噜| 91福利在线观看| 欧美在线三级| 日韩国产欧美在线视频| 久久免费偷拍视频| 美女精品网站| 91亚洲精品久久久蜜桃网站 | 校园激情久久| 成人综合激情网| 亚洲国产色一区| 精品久久久久久久人人人人传媒| 一区二区三区视频在线播放| 国产成人亚洲精品狼色在线| 亚洲精品欧美二区三区中文字幕| 欧美美女激情18p| 亚洲国产日韩在线| 国产伦精一区二区三区| 亚洲品质自拍视频| 欧美一区二区精品久久911| 9色国产精品| 丁香桃色午夜亚洲一区二区三区| 国产在线不卡一区| 2024国产精品视频| 一区二区三区在线观看视频 | 91网站最新地址| 免费成人你懂的| 国产精品福利一区| 在线观看91av| 国产精品日韩久久久| 成人av网址在线观看| 亚洲mv在线观看| 欧美国产乱子伦 |