国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

J2EE綜合:如何處理大數(shù)據(jù)量的查詢

2019-11-18 12:25:41
字體:
供稿:網(wǎng)友

  在實(shí)際的任何一個系統(tǒng)中,查詢都是必不可少的一個功能,而查詢設(shè)計(jì)的好壞又影響到系統(tǒng)的響應(yīng)時間和性能這兩個要害指標(biāo),尤其是當(dāng)數(shù)據(jù)量變得越來越大時,于是如何處理大數(shù)據(jù)量的查詢成了每個系統(tǒng)架構(gòu)設(shè)計(jì)時都必須面對的問題。本文將從數(shù)據(jù)及數(shù)據(jù)查詢的特點(diǎn)分析出發(fā),結(jié)合討論現(xiàn)有各種解決方案的優(yōu)缺點(diǎn)及其適用范圍,來闡述J2EE平臺下如何進(jìn)行查詢框架的設(shè)計(jì)。
  
  Value List Handler模式及其局限性
  
  在J2EE應(yīng)用中,對于大數(shù)據(jù)量查詢的處理有許多好的成功經(jīng)驗(yàn),比如Value List Handler設(shè)計(jì)模式就是其中非常經(jīng)典的一個,見圖1。該模式創(chuàng)建一個ValueListHandler對象來控制查詢的執(zhí)行以及結(jié)果集的緩存,它通過DAO(Data access Object)來執(zhí)行查詢,并將數(shù)據(jù)庫返回的結(jié)果集(傳輸對象Transfer Object的集合)緩存起來,接下來的客戶端查詢請求將直接從緩存中獲得。它的特點(diǎn)主要體現(xiàn)在兩點(diǎn):服務(wù)器端緩存數(shù)據(jù),每次只返回客戶端本次操作所需的數(shù)據(jù),通過這兩個措施來減少數(shù)據(jù)庫的訪問次數(shù)以及增加客戶端的響應(yīng)速度,達(dá)到最優(yōu)的查詢效果。當(dāng)然,這里面隱含一個前提就是客戶端采用分頁的方式來瀏覽數(shù)據(jù)。關(guān)于該模式的具體介紹,請參考[Core J2EE Patterns]一書。
  
J2EE綜合:如何處理大數(shù)據(jù)量的查詢

  
圖1:Value List Handler類圖

  
  但是在實(shí)際的應(yīng)用過程中,會發(fā)現(xiàn)該模式存在一定的局限性,其實(shí)可以說是該模式應(yīng)用具有一些前提條件:
  1、由于緩存是以內(nèi)存來換性能,這對于小數(shù)據(jù)量會工作得很好,但是假如結(jié)果集很大,內(nèi)存消耗將會非常嚴(yán)重。同時,消耗在處理結(jié)果集上的時間也會越來越長,比如要循環(huán)讀取記錄集中的數(shù)據(jù),然后依次填充每個傳輸對象,想想看幾百萬條數(shù)據(jù)這樣處理起來肯定讓人不能忍受。過長的處理時間不僅降低反應(yīng)速度,同時還會占用寶貴的數(shù)據(jù)庫連接資源,造成其它地方無連接可用。雖然,在DAO模式中利用CachedRowSet,Read Only RowSet ,RowSet Wrapper List等策略(詳見參考資料)來代替Transfer Object Collection策略,有效地提高了處理速度,但是仍然存在著在大集合數(shù)據(jù)中進(jìn)行定位、遍歷等問題。試想一想,即使在CachedRowSet中的absolute(2000000)也是非常費(fèi)時的操作。所有這一切的根源就在于緩存是一次性讀取所有的數(shù)據(jù),雖然有時你可以利用業(yè)務(wù)邏輯來強(qiáng)制性增加一些限制條件(比如產(chǎn)品查詢必須選擇大類和次類),但這種限制往往是不牢靠的或者說只是一時的權(quán)宜之計(jì)。也有人提出,可以不必緩存所有的查詢結(jié)果,而采取只緩存部分結(jié)果集,比如500,1000條,但這樣一來,就涉及到復(fù)雜的查詢數(shù)據(jù)是否越界的控制,增加了復(fù)雜度,同時也不易實(shí)現(xiàn)。
  
  2、既然使用緩存,那就不得不面對一個數(shù)據(jù)更新的問題,使用緩存,實(shí)際上就假定了在數(shù)據(jù)緩存期間,數(shù)據(jù)庫中的數(shù)據(jù)不會改變,或者這些改變可以不被反映出來。但是,在很多場合下(比如常見的業(yè)務(wù)系統(tǒng)中)這些數(shù)據(jù)庫中的數(shù)據(jù)經(jīng)常會發(fā)生變化,而且這些改變需要及時反映給客戶端。
  
  3、緩存其實(shí)存在一個基本前提,就是緩存的數(shù)據(jù)會被客戶端反復(fù)查詢使用,具體到分頁查詢就是客戶會選擇不同的頁數(shù)來查看數(shù)據(jù)。假如客戶端的查詢條件始終變化,或者用戶基本上只關(guān)心第一頁的數(shù)據(jù)(仔細(xì)琢磨一下用戶的習(xí)慣,這在很多中應(yīng)用場合都很常見),那緩存就失去了應(yīng)有的意義,變得多此一舉了。
  
  數(shù)據(jù)分析
  
  所以說,在決定是否應(yīng)用某種設(shè)計(jì)模式前,我們需要對被查詢數(shù)據(jù)的特點(diǎn)以及這些數(shù)據(jù)以何種方式被使用(查詢的特點(diǎn))進(jìn)行一個分析,根據(jù)不同的結(jié)論來決定采用何種處理策略。而且,數(shù)據(jù)本身的特點(diǎn)和被使用的方式往往交織在一起,需要綜合起來考慮,但這其中主要的考量點(diǎn)還是數(shù)據(jù)查詢的特點(diǎn)。
  
  一般來說,可以從以下幾個方面來分析數(shù)據(jù):
  
  1、  數(shù)據(jù)量大。
  這是我們今天討論的數(shù)據(jù)的一個最基本特點(diǎn),這個特點(diǎn)在查詢框架設(shè)計(jì)時要引起足夠的重視。
  注重:大數(shù)據(jù)量的查詢是指查詢時匹配條件的數(shù)據(jù)量大,而不是指表中的數(shù)據(jù)量大,雖然大部分時候這兩者都是一致的。因?yàn)樵谀承┣闆r下,業(yè)務(wù)邏輯可以限制或者只需要一次獲取很少量的數(shù)據(jù),而查詢的表中的數(shù)據(jù)量卻可能很大,那這種情況就不屬于本文的討論范圍。
  
  2、  關(guān)聯(lián)復(fù)雜,多表關(guān)聯(lián)。
  越是簡單的數(shù)據(jù)可能關(guān)聯(lián)越少,而越是復(fù)雜的數(shù)據(jù)往往都是多表關(guān)聯(lián),這樣很多時候你需要將這幾張表作為一個整體來考慮。
  
  3、  變化頻率。
  從這個角度出發(fā),可以大致將數(shù)據(jù)分為以下幾類:幾乎不變化的睡眠數(shù)據(jù);有規(guī)律定時更新的數(shù)據(jù),比如招聘網(wǎng)站的職位信息;經(jīng)常性無規(guī)律更新的數(shù)據(jù)。
  
  4、  成長性。
  數(shù)據(jù)是否具有成長性,要預(yù)見數(shù)據(jù)的成長性,并在現(xiàn)有方案中考慮這種成長性,避免到時候查詢框架的重新設(shè)計(jì),象大部分的業(yè)務(wù)數(shù)據(jù)都具有這種成長性。
  注重:這里也要非凡注重區(qū)分?jǐn)?shù)據(jù)本身的成長性和數(shù)據(jù)查詢的成長性,這看似等同的兩者其實(shí)還是存在很大的區(qū)別。就拿招聘網(wǎng)站來說,有效職位的數(shù)據(jù)肯定是一天天在增加,具有高成長性,但是在某個區(qū)間(比如一個月,一個星期)內(nèi)的有效職位查詢則變化不會太大,不具有成長性。而后者卻往往是實(shí)際系統(tǒng)中最常碰到的查詢情況。
  
  5、  數(shù)據(jù)查詢的頻率和方式。
  所有的數(shù)據(jù)查詢不可能被等同地使用,你要分清楚系統(tǒng)中的幾個要害查詢,這些查詢使用頻率高,響應(yīng)要快。試想一想,假如一個電子商務(wù)系統(tǒng)的產(chǎn)品查詢每次都要讓顧客等上十秒鐘,結(jié)果就可想而知。
  
  用戶的使用習(xí)慣分析
  
  除了對數(shù)據(jù)查詢本身需要進(jìn)行分析之外,我們還需要去分析一下用戶如何來使用或者看待這些數(shù)據(jù),用戶的使用習(xí)慣如何。有人可能覺得這作用不大,或者很難去分析,其實(shí)查詢的最終使用者是用戶,他們的一些習(xí)慣會很大程度上左右你的設(shè)計(jì)。
  
  1、  用戶關(guān)心數(shù)據(jù)哪些方面的特性,不關(guān)心哪些方面的特性。
  上面我們分析了數(shù)據(jù)本身的許多特性,那用戶對其中哪些特性最敏感呢?比如說對臟數(shù)據(jù)非凡不能接受,那我們就必須在查詢框架設(shè)計(jì)時非凡照顧到這一點(diǎn)。因?yàn)樵俸玫目蚣茉O(shè)計(jì)都不可能在每個方面都能達(dá)到最優(yōu)的效果,當(dāng)必須有所取舍的時候,我們就要明白哪些特性是客戶最關(guān)心的。
  
  2、  用戶如何來使用數(shù)據(jù)。
  現(xiàn)在一般查詢的客戶端都采用分頁的方式,一個查詢可能會存在十幾頁甚至幾十頁結(jié)果。對于某些查詢,用戶可能往往只關(guān)心第一頁或者前幾頁的結(jié)果,比如用戶需要查詢出最近完成的工單,而對于另外一些查詢,用戶可能對所有頁結(jié)果都很關(guān)注,比如用戶查詢出最近三天新增的招聘職位。這不同類型的查詢在查詢框架設(shè)計(jì)的時候都需要有所考慮并給予不同的處理策略。
  
  查詢框架的設(shè)計(jì)
  
  對數(shù)據(jù)及用戶使用習(xí)慣進(jìn)行了仔細(xì)的分析,接下來就可以根據(jù)這些分析來設(shè)計(jì)你的查詢框架了。在J2EE架構(gòu)下,對于大數(shù)據(jù)量的查詢主要采取以下兩種方法:
  
  基于緩存的方式:
  從數(shù)據(jù)庫得到全部(部分)數(shù)據(jù),并將其在服務(wù)器端進(jìn)行緩存,接下來的客戶端請求,將直接從緩存中取得需要的數(shù)據(jù)。這其實(shí)就是Value List Handler模式的原理,它主要適用于數(shù)據(jù)量不是非常大,變化不是很頻繁(或者變化頻繁但是有規(guī)律)且不具有成長性的情況,比如招聘網(wǎng)站或者電子商務(wù)網(wǎng)站的大部分查詢就非常適合采取這種方式。
  
  采用這種方式,要非凡注重第一次查詢問題,避免響應(yīng)性能達(dá)不到要求,因?yàn)槊總€查詢第一次都需要連接數(shù)據(jù)庫,從中獲取數(shù)據(jù)并緩存起來,所以第一次查詢會比接下來的查詢都顯得更慢一些。
  
  對于數(shù)據(jù)的緩存,有以下幾種實(shí)現(xiàn)方式:
  ?  直接緩存在服務(wù)器端
  Value List Handler模式就采取這種方式,并且可以根據(jù)不同的情況采取不同的緩存策略,比如Transfer Object集合,CachedRowSet等,這取決于你的DAO實(shí)現(xiàn)策略。
  ?  用臨時表來保存查詢結(jié)果
  WLDJ(www.sys-con.com/weblogic/)雜志2004年第7期上有一篇名為“Handling Large Database Result Sets”的文章,它具體介紹了如何利用臨時表來改良Value List Handler模式以支持大型的J2EE應(yīng)用。
  
  當(dāng)然除了以上這些方法以外,實(shí)現(xiàn)緩存也可以求助于操作系統(tǒng)的特定實(shí)現(xiàn),以前我在IBM DW發(fā)表過一篇探討MMF在java中應(yīng)用的文章(見參考資料),可惜未有深入,有愛好的朋友可以參考一下。
  
  在使用Value List Handler模式時,要非凡注重以下幾點(diǎn):
  
  1、  該模式一般和DAO模式搭配使用。
  
  2、  該模式有POJO,stateful session bean兩種實(shí)現(xiàn)策略。
  
  3、  假如采取stateful session bean實(shí)現(xiàn)策略,則默認(rèn)該緩存的時間長度為整個用戶會話。
  
  前面我們也提到過,假如數(shù)據(jù)不是絕對不變的,那緩存就面臨更新的問題,一旦更新就可能存在著數(shù)據(jù)不一致,假如恰巧客戶也希望能夠看到變化的效果,這個時候就需要采取某種措施來保證這種一致性。常見的措施可以是設(shè)置一個標(biāo)志位,每次發(fā)生數(shù)據(jù)更新后都將其對應(yīng)的標(biāo)志位更新,查詢時假如發(fā)現(xiàn)標(biāo)志位更新了,就直接從數(shù)據(jù)庫獲取數(shù)據(jù),而不是從緩存中獲取數(shù)據(jù)。另外一種方式就是數(shù)據(jù)更新的同時主動去清空session中的緩存,假如采用stateful session bean實(shí)現(xiàn)策略的話。
  
  當(dāng)然,采取緩存方式的大數(shù)據(jù)量查詢一般來說都不大可能碰到設(shè)置更新標(biāo)志位的問題,因?yàn)檫@種應(yīng)用方式?jīng)Q定了數(shù)據(jù)不大可能變化,或者數(shù)據(jù)變化不要求馬上反應(yīng)給用戶。比如招聘網(wǎng)站新增加了一些職位信息,假如這些更新恰巧發(fā)生在某些用戶的會話期間,且沒有設(shè)置更新標(biāo)志位,那這些新增信息就不會反應(yīng)到用戶的查詢結(jié)果中,這種處理方式也是可以接受的

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 浦东新区| 永济市| 来安县| 南昌县| 辽中县| 石棉县| 荔波县| 库伦旗| 大兴区| 泽库县| 桃园县| 彰武县| 石狮市| 宝应县| 千阳县| 上高县| 横山县| 洛宁县| 罗城| 余庆县| 无锡市| 庆元县| 闽清县| 青浦区| 清新县| 英超| 桦川县| 浦县| 庆阳市| 宝坻区| 安福县| 安义县| 南昌县| 信丰县| 仪征市| 贡觉县| 无锡市| 钟祥市| 吴忠市| 林州市| 夏河县|