JAVA技巧:Java中的大量數(shù)據(jù)查詢 |
來(lái)源:考試大 2010年02月01日 09:33 |
解決方案一:直接使用ResultSet來(lái)處理 從ResultSet中將查詢結(jié)果讀入collection,緩存在HttpSession或有狀態(tài)bean中,翻頁(yè)的時(shí)候從緩存中取出一頁(yè)數(shù)據(jù)顯示。這種方法有兩個(gè)主要的缺點(diǎn):一是用戶可能看到的是過(guò)期數(shù)據(jù);二是如果數(shù)據(jù)量非常大時(shí)第一次查詢遍歷結(jié)果集會(huì)耗費(fèi)很長(zhǎng)時(shí)間,并且緩存的數(shù)據(jù)也會(huì)占用大量?jī)?nèi)存,效率明顯下降。 對(duì)上述方法的一種改進(jìn)是當(dāng)用戶第一請(qǐng)求數(shù)據(jù)查詢時(shí),就執(zhí)行SQL語(yǔ)句查詢,獲得的ResultSet對(duì)象及其要使用的連接對(duì)象都保存到其對(duì)應(yīng)的會(huì)話對(duì)象中。以后的分頁(yè)查詢都通過(guò)第一次執(zhí)行SQL獲得的ResultSet對(duì)象定位取得指定頁(yè)的記錄(使用rs.last();rs.getRow() 獲得總計(jì)錄條數(shù),使用rs.absolute()定位到本頁(yè)起始記錄)。最后在用戶不再進(jìn)行分頁(yè)查詢時(shí)或會(huì)話關(guān)閉時(shí),釋放數(shù)據(jù)庫(kù)連接和ResultSet 對(duì)象等數(shù)據(jù)庫(kù)訪問(wèn)資源。每次翻頁(yè)都只從ResultSet中取出一頁(yè)數(shù)據(jù)。這種方式在某些數(shù)據(jù)庫(kù)(如oracle)的JDBC實(shí)現(xiàn)中差不多也是回緩存所有記錄而占用大量?jī)?nèi)存,同時(shí)速度也非常慢。 在用例分頁(yè)查詢的整個(gè)會(huì)話期間,一個(gè)用戶的分頁(yè)查詢就要占用一個(gè)數(shù)據(jù)庫(kù)連接對(duì)象和結(jié)果集的游標(biāo),這種方式對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)資源占用比較大,并且其利用率不是很高。 優(yōu)點(diǎn):減少了數(shù)據(jù)庫(kù)連接對(duì)象的多次分配獲取,減少了對(duì)數(shù)據(jù)庫(kù)的SQL查詢執(zhí)行。 缺點(diǎn):占用數(shù)據(jù)庫(kù)訪問(wèn)資源-數(shù)據(jù)庫(kù)連接對(duì)象,并占用了數(shù)據(jù)庫(kù)上的資源-游標(biāo);會(huì)消耗大量?jī)?nèi)存; 解決方案二:定位行集SQL查詢 使用數(shù)據(jù)庫(kù)產(chǎn)品提供的對(duì)查詢的結(jié)果集可定位行范圍的SQL接口技術(shù)。在用戶的分頁(yè)面查詢請(qǐng)求中,每次可取得查詢請(qǐng)求的行范圍的參數(shù),然后使用這些參數(shù)生產(chǎn)取得指定行范圍的的SQL查詢語(yǔ)句,然后每次請(qǐng)求獲得一個(gè)數(shù)據(jù)庫(kù)連接對(duì)象并執(zhí)行SQL查詢,把查詢的結(jié)果返回給用戶,最后釋放說(shuō)有的數(shù)據(jù)庫(kù)訪問(wèn)資源。 這種方式需要每次請(qǐng)求時(shí)都要執(zhí)行數(shù)據(jù)庫(kù)的SQL查詢語(yǔ)句;對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)資源是使用完就立即釋放,不白白占用數(shù)據(jù)庫(kù)訪問(wèn)資源。對(duì)特定(提供了對(duì)查詢結(jié)果集可定位功能的)的數(shù)據(jù)庫(kù)產(chǎn)品,如:Oracle(rowid或rownum ),DB2(rowid或rownum ()), PostgreSQL(LIMIT 和 OFFSET),mySQL(Limit)等。(MS SQL Server 沒(méi)有提供此技術(shù)。) 下面是在oracle下的查詢語(yǔ)句示例: SELECT * FROM ( SELECT row_.*, rownum rownum_ FROM (...... ) row_ WHERE rownum <= {pageNumber*rowsPerPage}) WHERE rownum_ > {(pageNumber-1)*rowsPerPage} 優(yōu)點(diǎn):對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)資源(數(shù)據(jù)庫(kù)連接對(duì)象,數(shù)據(jù)庫(kù)游標(biāo)等)沒(méi)有浪費(fèi),這些資源的充分重復(fù)的利用。 缺點(diǎn):對(duì)每次分頁(yè)面查詢請(qǐng)求要頻繁的從Web容器中獲得數(shù)據(jù)庫(kù)訪問(wèn)資源(數(shù)據(jù)庫(kù)連接對(duì)象和數(shù)據(jù)庫(kù)游標(biāo))并建立連接;要依賴于具體的數(shù)據(jù)庫(kù)產(chǎn)品的支持 |
聯(lián)系客服