




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、JAVA資格認(rèn)證:Hernate的優(yōu)化方案在Hibernate 2中,假如需要對(duì)任何數(shù)據(jù)進(jìn)展修改和刪除操作,都需要先執(zhí)行查詢操作,在得到要修改或者刪除的數(shù)據(jù)后,再對(duì)該數(shù)據(jù)進(jìn)展相應(yīng)的操作處理。在數(shù)據(jù)量少的狀況下采納這種處理方式?jīng)]有問(wèn)題,但需要處理大量數(shù)據(jù)的時(shí)候就可能存在以下的問(wèn)題:占用大量的內(nèi)存。需要屢次執(zhí)行update/delete語(yǔ)句,而每次執(zhí)行只能處理一條數(shù)據(jù)。以上兩個(gè)問(wèn)題的消失會(huì)嚴(yán)峻影響系統(tǒng)的性能。因此,在Hibernate 3中引入了用于批量更新或者刪除數(shù)據(jù)的HQL語(yǔ)句。這樣,開(kāi)發(fā)人員就可以一次更新或者刪除多條記錄,而不用每次都一個(gè)一個(gè)地修改或者刪除記錄了。假如要?jiǎng)h除全部的User對(duì)象
2、(也就是User對(duì)象所對(duì)應(yīng)表中的記錄),則可以直接使用下面的HQL語(yǔ)句:delete User而在執(zhí)行這個(gè)HQL語(yǔ)句時(shí),需要調(diào)用Query對(duì)象的executeUpdate()方法,詳細(xì)的實(shí)例如下所示:String HQL= “delete User “;Query query二session.createQuery(HQL);int size=query.executeUpdate();采納這種方式進(jìn)展數(shù)據(jù)的修改和刪除時(shí)與直接使用JDBC的方式在性能上相差無(wú)幾,是推舉使用的正確方法。假如不能采納HQL語(yǔ)句進(jìn)展大量數(shù)據(jù)的修改,也就是說(shuō)只能使用取出再修改的方式時(shí),也會(huì)遇到批量插入時(shí)的內(nèi)存溢出問(wèn)題,
3、所以也要采納上面所供應(yīng)的處理方法來(lái)進(jìn)展類似的處理。二、使用SQL執(zhí)行批量操作在進(jìn)展批量插入、修改和刪除操作時(shí),直接使用JDBC來(lái)執(zhí)行原生態(tài)的SQL語(yǔ)句無(wú)疑會(huì)獲得的性能,這是由于在處理的過(guò)程中省略或者簡(jiǎn)化了以下處理內(nèi)容:HQL語(yǔ)句到SQL語(yǔ)句的轉(zhuǎn)換。Java對(duì)象的初始化。Java對(duì)象的緩存處理。但是在直接使用JDBC執(zhí)行SQL語(yǔ)句時(shí),有一個(gè)最重要的問(wèn)題就是要處理緩存中的Java對(duì)象。由于通過(guò)這種底層方式對(duì)數(shù)據(jù)的修改將不能通知緩存去進(jìn)展相應(yīng)的更新操作,以保證緩存中的對(duì)象與數(shù)據(jù)庫(kù)中的數(shù)據(jù)是全都的。三、提升數(shù)據(jù)庫(kù)查詢的性能數(shù)據(jù)庫(kù)查詢性能的提升也是涉及到開(kāi)發(fā)中的各個(gè)階段,在開(kāi)發(fā)中選用正確的查詢方法無(wú)疑是
4、最根底也最簡(jiǎn)潔的。1、SQL語(yǔ)句的優(yōu)化使用正確的SQL語(yǔ)句可以在很大程度上提高系統(tǒng)的查詢性能。獲得同樣數(shù)據(jù)而采納不同方式的SQL語(yǔ)句在性能上的差距可能是非常巨大的。由于Hibernate是對(duì)JDBC的封裝,SQL語(yǔ)句的產(chǎn)生都是動(dòng)態(tài)由Hibernate自動(dòng)完成的。Hibernate產(chǎn)生SQL語(yǔ)句的方式有兩種:一種是通過(guò)開(kāi)發(fā)人員編寫的HQL語(yǔ)句來(lái)生成,另一種是依據(jù)開(kāi)發(fā)人員對(duì)關(guān)聯(lián)對(duì)象的訪問(wèn)來(lái)自動(dòng)生成相應(yīng)的SQL語(yǔ)句。至于使用什么樣的SQL語(yǔ)句可以獲得更好的性能要依據(jù)數(shù)據(jù)庫(kù)的構(gòu)造以及所要獵取數(shù)據(jù)的詳細(xì)狀況來(lái)進(jìn)展處理。在確定了所要執(zhí)行的SQL語(yǔ)句后,可以通過(guò)以下三個(gè)方面來(lái)影響Hibernate所生成的S
5、QL語(yǔ)句:HQL語(yǔ)句的書寫方法。查詢時(shí)所使用的查詢方法。對(duì)象關(guān)聯(lián)時(shí)所使用的抓取策略。2、使用正確的查詢方法在前面已經(jīng)介紹過(guò),執(zhí)行數(shù)據(jù)查詢功能的根本方法有兩種:一種是得到單個(gè)長(zhǎng)久化對(duì)象的get()方法和load()方法,另一種是Query對(duì)象的list()方法和iterator。方法。在開(kāi)發(fā)中應(yīng)當(dāng)依據(jù)不同的狀況選用正確的方法。get()方法和load()方法的區(qū)分在于對(duì)二級(jí)緩存的使用上。load()方法會(huì)使用二級(jí)緩存,而get()方法在一級(jí)緩存沒(méi)有找到的狀況下會(huì)直接查詢數(shù)據(jù)庫(kù),不會(huì)去二級(jí)緩存中查找。在使用中,對(duì)使用了二級(jí)緩存的對(duì)象進(jìn)展查詢時(shí)使用load()方法,以充分利用二級(jí)緩存來(lái)提高檢索的效率
6、。list()方法和iterator。方法之間的區(qū)分可以從以下幾個(gè)方面來(lái)進(jìn)展比擬。執(zhí)行的查詢不同list()方法在執(zhí)行時(shí),是直接運(yùn)行查詢結(jié)果所需要的查詢語(yǔ)句,而iterator。方法則是先執(zhí)行得到對(duì)象ID的查詢,然后再依據(jù)每個(gè)ID值去取得所要查詢的對(duì)象。因此,對(duì)于list()方式的查詢通常只會(huì)執(zhí)行一個(gè)SQL語(yǔ)句,而對(duì)于iterator。方法的查詢則可能需要執(zhí)行N+1條SQL語(yǔ)句(N為結(jié)果集中的記錄數(shù))。iterator。方法只是可能執(zhí)行N+1條數(shù)據(jù),詳細(xì)執(zhí)行SQL語(yǔ)句的數(shù)量取決于緩存的狀況以及對(duì)結(jié)果集的訪問(wèn)狀況。緩存的使用list()方法只能使用二級(jí)緩存中的查詢緩存,而無(wú)法使用二級(jí)緩存對(duì)單個(gè)對(duì)
7、象的緩存(但是會(huì)把查詢出的對(duì)象放入二級(jí)緩存中)。所以,除非重復(fù)執(zhí)行一樣的查詢操作,否則無(wú)法利用緩存的機(jī)制來(lái)提高查詢的效率。iterator。方法則可以充分利用二級(jí)緩存,在依據(jù)ID檢索對(duì)象的時(shí)候會(huì)首先到緩存中查找,只有在找不到的狀況下才會(huì)執(zhí)行相應(yīng)的查詢語(yǔ)句。所以,緩存中對(duì)象的存在與否會(huì)影響到SQL語(yǔ)句的執(zhí)行數(shù)量。對(duì)于結(jié)果集的處理方法不同list()方法會(huì)一次獲得全部的結(jié)果集對(duì)象,而且它會(huì)依據(jù)查詢的結(jié)果初始化全部的結(jié)果集對(duì)象。這在結(jié)果集特別大的時(shí)候必定會(huì)占據(jù)特別多的內(nèi)存,甚至?xí)斐蓛?nèi)存溢出狀況的發(fā)生。iterator。方法在執(zhí)行時(shí)不會(huì)一次初始化全部的對(duì)象,而是依據(jù)對(duì)結(jié)果集的訪問(wèn)狀況來(lái)初始化對(duì)象。因
8、此在訪問(wèn)中可以掌握緩存中對(duì)象的數(shù)量,以避開(kāi)占用過(guò)多緩存,導(dǎo)致內(nèi)存溢出狀況的發(fā)生。使用iterator。方法的另外一個(gè)好處是,假如只需要結(jié)果集中的局部記錄,那么沒(méi)有被用到的結(jié)果對(duì)象根本不會(huì)被初始化。所以,對(duì)結(jié)果集的訪問(wèn)狀況也是調(diào)用iterator。方法時(shí)執(zhí)行數(shù)據(jù)庫(kù)SQL語(yǔ)句多少的一個(gè)因素。所以,在使用Query對(duì)象執(zhí)行數(shù)據(jù)查詢時(shí)應(yīng)當(dāng)從以上幾個(gè)方面去考慮使用何種方法來(lái)執(zhí)行數(shù)據(jù)庫(kù)的查詢操作。四、使用正確的抓取策略所謂抓取策略(fetching strategy)是指當(dāng)應(yīng)用程序需要利用關(guān)聯(lián)關(guān)系進(jìn)展對(duì)象獵取的時(shí)候,Hibernate獵取關(guān)聯(lián)對(duì)象的策略。抓取策略可以在O/R映射的元數(shù)據(jù)中聲明,也可以在特定
9、的HQL或條件查詢中聲明。Hibernate 3定義了以下幾種抓取策略。連接抓取(Join fetching)連接抓取是指Hibernate在獲得關(guān)聯(lián)對(duì)象時(shí)會(huì)在SELECT語(yǔ)句中使用外連接的方式來(lái)獲得關(guān)聯(lián)對(duì)象。查詢抓取(Select fetching)查詢抓取是指Hibernate通過(guò)另外一條SELECT語(yǔ)句來(lái)抓取當(dāng)前對(duì)象的關(guān)聯(lián)對(duì)象的方式。這也是通過(guò)外鍵的方式來(lái)執(zhí)行數(shù)據(jù)庫(kù)的查詢。與連接抓取的區(qū)分在于,通常狀況下這個(gè)SELECT語(yǔ)句不是馬上執(zhí)行的,而是在訪問(wèn)到關(guān)聯(lián)對(duì)象的時(shí)候才會(huì)執(zhí)行。子查詢抓取(Subselect fetching)子查詢抓取也是指Hibernate通過(guò)另外一條SELECT語(yǔ)句來(lái)
10、抓取當(dāng)前對(duì)象的關(guān)聯(lián)對(duì)象的方式。與查詢抓取的區(qū)分在于它所采納的SELECT語(yǔ)句的方式為子查詢,而不是通過(guò)外連接。批量抓取(Batch fetching)批量抓取是對(duì)查詢抓取的優(yōu)化,它會(huì)依據(jù)主鍵或者外鍵的列表來(lái)通過(guò)單條SELECT語(yǔ)句實(shí)現(xiàn)治理對(duì)象的批量抓取。以上介紹的是Hibernate 3所供應(yīng)的抓取策略,也就是抓取關(guān)聯(lián)對(duì)象的手段。為了提升系統(tǒng)的性能,在抓取關(guān)聯(lián)對(duì)象的時(shí)機(jī)上,還有以下一些選擇。馬上抓取(Immediate fetching)馬上抓取是指宿主對(duì)象被加載時(shí),它所關(guān)聯(lián)的對(duì)象也會(huì)被馬上加載。延遲集合抓取(Lazy collection fetching)延遲集合抓取是指在加載宿主對(duì)象時(shí),
11、并不馬上加載它所關(guān)聯(lián)的對(duì)象,而是到應(yīng)用程序訪問(wèn)關(guān)聯(lián)對(duì)象的時(shí)候才抓取關(guān)聯(lián)對(duì)象。這是集合關(guān)聯(lián)對(duì)象的默認(rèn)行為。延遲代理抓取(Lazy proxy fetching)延遲代理抓取是指在返回單值關(guān)聯(lián)對(duì)象的狀況下,并不在對(duì)其進(jìn)展get操作時(shí)抓取,而是直到調(diào)用其某個(gè)方法的時(shí)候才會(huì)抓取這個(gè)對(duì)象。延遲屬性加載(Lazy attribute fetching)延遲屬性加載是指在關(guān)聯(lián)對(duì)象被訪問(wèn)的時(shí)候才進(jìn)展關(guān)聯(lián)對(duì)象的抓取。介紹了 Hibernate所供應(yīng)的關(guān)聯(lián)對(duì)象的抓取方法和抓取時(shí)機(jī),這兩個(gè)方面的因素都會(huì)影響Hibernate的抓取行為,最重要的是要清晰這兩方面的影響是不同的,不要將這兩個(gè)因素混淆,在開(kāi)發(fā)中要結(jié)合實(shí)際
12、狀況選用正確的抓取策略和適宜的抓取時(shí)機(jī)。抓取時(shí)機(jī)的選擇在Hibernate 3中,對(duì)于集合類型的關(guān)聯(lián)在默認(rèn)狀況下會(huì)使用延遲集合加載的抓取時(shí)機(jī),而對(duì)于返回單值類型的關(guān)聯(lián)在默認(rèn)狀況下會(huì)使用延遲代理抓取的抓取時(shí)機(jī)。對(duì)于馬上抓取在開(kāi)發(fā)中很少被用到,由于這很可能會(huì)造成不必要的數(shù)據(jù)庫(kù)操作,從而影響系統(tǒng)的性能。當(dāng)宿主對(duì)象和關(guān)聯(lián)對(duì)象總是被同時(shí)訪問(wèn)的時(shí)候才有可能會(huì)用到這種抓取時(shí)機(jī)。另外,使用馬上連接抓取可以通過(guò)外連接來(lái)削減查詢SQL語(yǔ)句的數(shù)量,所以,也會(huì)在某些特別的狀況下使用。然而,延遲加載又會(huì)面臨另外一個(gè)問(wèn)題,假如在Session關(guān)閉前關(guān)聯(lián)對(duì)象沒(méi)有被實(shí)例化,那么在訪問(wèn)關(guān)聯(lián)對(duì)象的時(shí)候就會(huì)拋出特別。處理的方法就是
13、在事務(wù)提交之前就完成對(duì)關(guān)聯(lián)對(duì)象的訪問(wèn)。所以,在通常狀況下都會(huì)使用延遲的方式來(lái)抓取關(guān)聯(lián)的對(duì)象。由于每個(gè)馬上抓取都會(huì)導(dǎo)致關(guān)聯(lián)對(duì)象的馬上實(shí)例化,太多的馬上抓取關(guān)聯(lián)會(huì)導(dǎo)致大量的對(duì)象被實(shí)例化,從而占用過(guò)多的內(nèi)存資源。抓取策略的選取對(duì)于抓取策略的選取將影響到抓取關(guān)聯(lián)對(duì)象的方式,也就是抓取關(guān)聯(lián)對(duì)象時(shí)所執(zhí)行的SQL語(yǔ)句。這就要依據(jù)實(shí)際的業(yè)務(wù)需求、數(shù)據(jù)的數(shù)量以及數(shù)據(jù)庫(kù)的構(gòu)造來(lái)進(jìn)展選擇了。在這里需要留意的是,通常狀況下都會(huì)在執(zhí)行查詢的時(shí)候針對(duì)每個(gè)查詢來(lái)指定對(duì)其適宜的抓取策略。指定抓取策略的方法如下所示:User user = (User) session.createCriteria(User.class).setFetchMode( “permissions “, FetchMode.JOIN).add( Restrictions.idEq(userld).uniqueResult();五、查詢性能提升小結(jié)在本小節(jié)中介紹了查詢性能提升的方法,關(guān)鍵是如何通過(guò)優(yōu)化SQL語(yǔ)句來(lái)提升系統(tǒng)的查詢性能。查詢方法和抓取策略的影響也是通過(guò)執(zhí)行查詢方式和SQL語(yǔ)句的多少來(lái)轉(zhuǎn)變系統(tǒng)的性能的。這些都屬于開(kāi)發(fā)人員所應(yīng)當(dāng)把握的根
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 光伏建筑一體化示范城市企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書
- 會(huì)所領(lǐng)班管理制度
- 會(huì)計(jì)助理管理制度
- 會(huì)計(jì)班費(fèi)管理制度
- 會(huì)議材料管理制度
- 會(huì)議通過(guò)管理制度
- 河南輕工職業(yè)學(xué)院《環(huán)境藝術(shù)與建筑設(shè)計(jì)作品鑒賞》2023-2024學(xué)年第二學(xué)期期末試卷
- 傳統(tǒng)康復(fù)管理制度
- 傷殘?jiān)u定管理制度
- 低保核查管理制度
- (5篇)2025年春《形勢(shì)與政策》專題測(cè)驗(yàn)與形勢(shì)與政策大作業(yè)詳細(xì)
- 防止電力生產(chǎn)事故的二十五項(xiàng)重點(diǎn)要求 (2023 版)
- 輔警寫作試題及答案
- 【北京市人社局】2025年北京市人力資源市場(chǎng)薪酬數(shù)據(jù)報(bào)告(一季度)
- 宇宙射線對(duì)航天員影響-全面剖析
- 皮膚微生態(tài)與微生態(tài)護(hù)膚品的探討
- ZYJ電液轉(zhuǎn)轍機(jī)機(jī)械故障處理信號(hào)基礎(chǔ)設(shè)備課件
- 第八講-人無(wú)精神則不立-國(guó)無(wú)精神則不強(qiáng)-教學(xué)設(shè)計(jì)(表格式)
- 食堂7s管理標(biāo)準(zhǔn)
- 藥廠記錄填寫培訓(xùn)
- 幼兒園圍裙劇繪本說(shuō)課
評(píng)論
0/150
提交評(píng)論