日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Hibernate優(yōu)化

 software1 2012-07-11

花絮

         第一次去面試的時(shí)候人家人如何在SSH框架下,如何進(jìn)行Hibernate的優(yōu)化,當(dāng)時(shí)自己只是看到這些根本就沒有系統(tǒng)的總結(jié)這些東西,今天終于找到一個(gè)時(shí)間來解決一下自己面試的這個(gè)問題了。

Hibernate自述

           我天生效率比較低,在普遍情況下,需要將執(zhí)行轉(zhuǎn)換為SQL語句的Hibernate低于直接JDBC存取。但是在經(jīng)過比較好的性能優(yōu)化之后,我的性能還是讓人相當(dāng)滿意的,特別是應(yīng)用二級(jí)緩存之后,甚至可以獲得比較不使用緩存的JDBC更好的性能。

優(yōu)化總結(jié)

           要想優(yōu)化Hibernate,我們必須知道應(yīng)該從什么地方進(jìn)行優(yōu)化,從什么地方入手。Hibernate的優(yōu)化方向:數(shù)據(jù)庫設(shè)計(jì)、HQL優(yōu)化、緩存、主配置、延遲加載、方法選用、集合選用、事物控制、批量操作

 

具體分析

第一點(diǎn):數(shù)據(jù)庫設(shè)計(jì)

       前邊博客介紹過 數(shù)據(jù)庫設(shè)計(jì),今天我們還從這開始,表的設(shè)計(jì)就是建樓的基礎(chǔ),如何讓基礎(chǔ)簡(jiǎn)潔而結(jié)實(shí)這是最重要的。

優(yōu)化策略:

1.   建索引

2.   減少表之間的關(guān)聯(lián)

3.   簡(jiǎn)化查詢字段,沒用的字段不要,已經(jīng)對(duì)返回結(jié)果的控制,盡量返回少量數(shù)據(jù)

4.   適當(dāng)?shù)娜哂鄶?shù)據(jù),不過分最求高范式

第二點(diǎn):HQL優(yōu)化


                                            (HQL知識(shí)圖)

     假如想好好了解一下的建議看一下這篇博客HQL詳細(xì)使用,我個(gè)人認(rèn)為寫的還可以,知識(shí)總結(jié)的很細(xì)致。

總結(jié):

1.   實(shí)體查詢:可以使用sql語句查詢

2.   實(shí)體的更新和刪除:hibernate3中直接提供更加靈活更加效率的解決方法

3.   屬性查詢:動(dòng)態(tài)構(gòu)造實(shí)例對(duì)象,對(duì)結(jié)果集進(jìn)行封裝

4.   分組與排序:

A.   Order by子句

B.   Group by子句與統(tǒng)計(jì)查詢

C.   優(yōu)化統(tǒng)計(jì)查詢:內(nèi)連接,外連接

5.   參數(shù)綁定:和jdbc一樣,對(duì)hibernate的參數(shù)綁定提供了豐富的支持。

第三點(diǎn):緩存

運(yùn)行機(jī)制:

介于應(yīng)用程序和物理數(shù)據(jù)源之間,其作用是為了降低應(yīng)用程序?qū)ξ锢頂?shù)據(jù)源訪問的頻數(shù),從而提高運(yùn)行性能。

緩存被廣泛應(yīng)用的用于優(yōu)化數(shù)據(jù)庫。當(dāng)一些數(shù)據(jù)被從數(shù)據(jù)庫中讀取出來的時(shí)候,我們可以把它們放到緩存里。這樣我們可以再次使用的時(shí)候直接從緩存中取出來,這樣我們的效率就提高了很多。

控制范圍:

一級(jí)緩存是session對(duì)象的生命周期通常對(duì)應(yīng)的一個(gè)數(shù)據(jù)庫事務(wù)或者一個(gè)應(yīng)用事務(wù),它是事務(wù)范圍內(nèi)的緩存

二級(jí)緩存是一個(gè)可插拔的緩存插件,它是由SessionFactory負(fù)責(zé)管理。由于SessionFactory對(duì)象的生命周期和應(yīng)用程序的整個(gè)過程對(duì)應(yīng),所以二級(jí)緩存是進(jìn)城范圍或者集群范圍內(nèi)的緩存。用于初始化很少更改的數(shù)據(jù)、不重要的數(shù)據(jù),不會(huì)并發(fā)訪問的數(shù)據(jù)。

 

Hibernate緩存的一些問題和建議:hibernate的緩存

第四點(diǎn):捉取策略

1.  捉取優(yōu)化:Hibernate在關(guān)聯(lián)關(guān)系之間進(jìn)行導(dǎo)航,充分利用Hibernate提供的技術(shù)

2.  如何捉取

立即捉取:當(dāng)捉取宿主對(duì)象時(shí),同時(shí)捉取其相關(guān)對(duì)象和關(guān)聯(lián)集以及屬性

延遲加載:當(dāng)捉宿主對(duì)象時(shí),并不捉取其關(guān)聯(lián)對(duì)象,而是當(dāng)對(duì)其對(duì)象進(jìn)行調(diào)用時(shí)才加載。

3.  捉取粒度:設(shè)置捉取個(gè)數(shù)

第五點(diǎn):批量數(shù)據(jù)處理(修改和刪除)

在Hibernate2中,如果需要對(duì)任何數(shù)據(jù)進(jìn)行修改和刪除操作都需要先執(zhí)行查詢操作,在得到數(shù)據(jù)后才進(jìn)行修改和刪除。

1.  不適用Hibernate API而是直接使用JDBC  API來做原生態(tài)SQL語句進(jìn)行查詢,這種方法比較好,相對(duì)來說較快。

2.  運(yùn)用存儲(chǔ)過程

3.  一定量范圍內(nèi)可以使用hibernate API,但是特大數(shù)據(jù)量不行。

第六點(diǎn):結(jié)果集的使用:

     結(jié)果集的使用:list()和iterator()區(qū)別

查詢方式:

list只能利用查詢緩存(但在交易系統(tǒng)中查詢緩存作用不大),無法利用二級(jí)緩存中的單個(gè)實(shí)體,但是list查出的對(duì)象會(huì)寫入二級(jí)緩存,但它一般只生成較少的sql語句,很多情況就是一條。

iterator則利用二級(jí)緩存,對(duì)于一條查詢語句,它會(huì)先從數(shù)據(jù)庫中找到所有符合條件的記錄的ID,在通過ID去緩存找,對(duì)于緩存中沒有的記錄,在構(gòu)造語句從數(shù)據(jù)庫查出,第一次的執(zhí)行會(huì)產(chǎn)生N+1條SQL語句。

產(chǎn)生結(jié)果:

用list可能會(huì)溢出

通過Iterator,配合緩存管理API,在海量數(shù)據(jù)查詢中可以很好的解決內(nèi)存問題。

綜合考慮

一般List會(huì)填充二級(jí)緩存,卻不能利用二級(jí)緩存,而Iterator可以讀二級(jí)緩存,然而無法命中的話,效率很低效。一般處理方法,就是第一次查詢使用list,隨后使用iterator查詢。

總結(jié)

 

Hibernate優(yōu)化總結(jié)還有主配置、方法選用、事物控制沒有涉及到,因?yàn)樗鼈兿鄬?duì)來說這些方面比較簡(jiǎn)單,但是還是很重要的。

在實(shí)施一個(gè)項(xiàng)目的時(shí)候我們沒有必要想這些問題,做項(xiàng)目的時(shí)候第一步運(yùn)行起來,第二步優(yōu)化一下。在很多小型項(xiàng)目中第二步一般都不會(huì)去做,所以說我們做工程的時(shí)候還是要牢記運(yùn)行出來,假如自己作為研究或者這個(gè)問題比較嚴(yán)重的話我們才考慮優(yōu)化。

Hibernate調(diào)優(yōu)方面沒有最有只有更優(yōu),讓我們不斷積極找到優(yōu)化的方法,來優(yōu)化我們的程序,來優(yōu)化我們自己。

關(guān)于Hibernate優(yōu)化方面,希望大家留下寶貴的意見,多對(duì)交流!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多