原創(chuàng)|行業(yè)資訊|編輯:龔雪|2014-07-10 09:46:42.000|閱讀 346 次
概述:SQL數(shù)據(jù)庫(kù)中查詢(xún)語(yǔ)句隨著查詢(xún)的對(duì)象越來(lái)越多,出現(xiàn)語(yǔ)句臃腫將導(dǎo)致內(nèi)存使用過(guò)多的情況!
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
如果當(dāng)SQL數(shù)據(jù)庫(kù)中select語(yǔ)句數(shù)目過(guò)多,就會(huì)影響數(shù)據(jù)庫(kù)的性能,如果需要查詢(xún)n個(gè)Customer對(duì)象,那么必須執(zhí)行n+1次select查詢(xún)語(yǔ)句。在Session的 緩存中存放的是相互關(guān)聯(lián)的對(duì)象圖。默認(rèn)情況下,當(dāng)Hibernate從數(shù)據(jù)庫(kù)中加載Customer對(duì)象時(shí),會(huì)同時(shí)加載所有關(guān)聯(lián)的Order對(duì)象。以 Customer和Order類(lèi)為例,假定ORDERS表的CUSTOMER_ID外鍵允許為null,圖1列出了CUSTOMERS表和ORDERS表中的記錄。

以下Session的find()方法用于到數(shù)據(jù)庫(kù)中檢索所有的Customer對(duì)象:
List customerLists=session.find("from Customer as c");
運(yùn)行以上find()方法時(shí),Hibernate將先查詢(xún)CUSTOMERS表中所有的記錄,然后根據(jù)每條記錄的ID,到ORDERS表中查詢(xún)有參照關(guān)系的記錄,Hibernate將依次執(zhí)行以下select語(yǔ)句:
select * from CUSTOMERS;
select * from ORDERS where CUSTOMER_ID=1;
select * from ORDERS where CUSTOMER_ID=2;
select * from ORDERS where CUSTOMER_ID=3;
select * from ORDERS where CUSTOMER_ID=4;
select語(yǔ)句的數(shù)目太多,需要頻繁的訪問(wèn)數(shù)據(jù)庫(kù),會(huì)影響檢索性能。如果需要查詢(xún)n個(gè)Customer對(duì)象,那么必須執(zhí)行n+1次select查詢(xún)語(yǔ)句。這就是經(jīng)典的n+1次select查詢(xún)問(wèn)題。
通過(guò)以上5條select語(yǔ)句,Hibernate最后加載了4個(gè)Customer對(duì)象和5個(gè)Order對(duì)象,在內(nèi)存中形成了一幅關(guān)聯(lián)的對(duì)象圖。

Hibernate在檢索與Customer關(guān)聯(lián)的Order對(duì)象時(shí),使用了默認(rèn)的立即檢索策略。這種檢索策略存在兩大不足:
1、select語(yǔ)句的數(shù)目太多,需要頻繁的訪問(wèn)數(shù)據(jù)庫(kù),會(huì)影響檢索性能。如果需要查詢(xún)n個(gè)Customer對(duì)象,那么必須執(zhí)行n+1次select查詢(xún)語(yǔ) 句。這就是經(jīng)典的n+1次select查詢(xún)問(wèn)題。這種檢索策略沒(méi)有利用SQL的連接查詢(xún)功能,例如以上5條select語(yǔ)句完全可以通過(guò)以下1條 select語(yǔ)句來(lái)完成:
select * from CUSTOMERS left outer join ORDERS
on CUSTOMERS.ID=ORDERS.CUSTOMER_ID
以上select語(yǔ)句使用了SQL的左外連接查詢(xún)功能,能夠在一條select語(yǔ)句中查詢(xún)出CUSTOMERS表的所有記錄,以及匹配的ORDERS表的記錄。
2、在應(yīng)用邏輯只需要訪問(wèn)Customer對(duì)象,而不需要訪問(wèn)Order對(duì)象的場(chǎng)合,加載Order對(duì)象完全是多余的操作,這些多余的Order對(duì)象白白浪費(fèi)了許多內(nèi)存空間。
傾情推薦EMSSoftware公司旗下SQL數(shù)據(jù)量管理工具來(lái)解決數(shù)據(jù)庫(kù)各項(xiàng)問(wèn)題。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn