成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Hibernate性能優(yōu)化

開發(fā) 后端
本文講述的是Hibernate性能優(yōu)化,講述了三種優(yōu)化策略:抓取優(yōu)化、二級緩存優(yōu)化和批量數(shù)據(jù)操作優(yōu)化。

有很多人認(rèn)為Hibernate天生效率比較低,確實(shí),在普遍情況下,需要將執(zhí)行轉(zhuǎn)換為SQL語句的Hibernate的效率低于直接JDBC存取,然而,在經(jīng)過比較好的性能優(yōu)化之后,Hibernate的性能還是讓人相當(dāng)滿意的,特別是應(yīng)用二級緩存之后,甚至可以獲得比較不使用緩存的JDBC更好的性能,下面介紹一些通常的Hibernate性能優(yōu)化的策略:

1.Hibernate性能優(yōu)化之抓取優(yōu)化
抓取是指Hibernate如何在關(guān)聯(lián)關(guān)系之間進(jìn)行導(dǎo)航的時(shí)候,Hibernate如何獲取關(guān)聯(lián)對象的策略,其主要定義了兩個(gè)方面:如何抓取和何時(shí)抓取

1)如何抓取。
Hibernate3主要有兩種種抓取方式,分.應(yīng)用于對象關(guān)聯(lián)實(shí)例(many-to-one、one-to-one)和對象關(guān)聯(lián)集合(set、map等),總共是四種變種
JOIN抓取: 通過在SELECT語句中使用OUTER JOIN來獲得對象的關(guān)聯(lián)實(shí)例或者關(guān)聯(lián)集合)
SELECT抓取: 另外發(fā)送一條SELECT語句來抓取當(dāng)前對象的關(guān)聯(lián)實(shí)體和集合
在我的開發(fā)經(jīng)歷中,此處對性能的優(yōu)化是比較有限的,并不值得過多關(guān)注
例:
A.應(yīng)用于對象關(guān)聯(lián)實(shí)例(默認(rèn)是false)

  1. ".." outer-join="true/false/auto"  .../>  

B.應(yīng)用于對象關(guān)聯(lián)集合(默認(rèn)是auto)

  1. ".." fetch="join/select" ... >  
  2.    ....  
  3.  

2)何時(shí)抓取
主要分為延遲加載和立即抓取,默認(rèn)的情況下Hibernate3對對象關(guān)聯(lián)實(shí)采用延遲加載,普通屬性采用立即抓取,通過延遲加載和采用適當(dāng)?shù)淖ト×6龋c不采用優(yōu)化相比往往可以將性能提升數(shù)倍
立即抓取:當(dāng)抓取宿主對象時(shí),同時(shí)抓取其關(guān)聯(lián)對象和關(guān)聯(lián)集以及屬性
延遲加載:當(dāng)抓取宿主對象時(shí),并不抓取其關(guān)聯(lián)對象,而是當(dāng)對其對象進(jìn)行調(diào)用時(shí)才加載
例:
A.應(yīng)用于對象關(guān)聯(lián)實(shí)例(默認(rèn)是延遲加載)
   
B.應(yīng)用于對象關(guān)聯(lián)集合(默認(rèn)是延遲加載)   
   

對于延遲加載,需要注意的時(shí),對延遲對象的使用必須在Session關(guān)閉之前進(jìn)行,Hibernate的LazyInitalizationException往往就是由于在Session的生命期外使用了延遲加載的對象。當(dāng)我們進(jìn)行Web開發(fā)時(shí),可以使用OpenSessionInView模式,當(dāng)請求開始時(shí)打開session,當(dāng)請求響應(yīng)結(jié)束時(shí)才關(guān)閉session,不過,在使用OpenSessionInView模式時(shí),需要注意如果響應(yīng)時(shí)間比較長(業(yè)務(wù)比較復(fù)雜或者客戶端是低速網(wǎng)絡(luò)),將Session資源(也就是數(shù)據(jù)庫的連接)占用太久的話可以會導(dǎo)致資源耗盡

3)抓取粒度
抓取粒度指的是對象在關(guān)聯(lián)關(guān)系之間被導(dǎo)航時(shí)一次預(yù)先加載的數(shù)量,Hibernate程序的性能比較差往往就在于沒有對抓取粒度仔細(xì)考慮,當(dāng)加載一個(gè)列表并在列表中的每個(gè)對象中對其關(guān)聯(lián)進(jìn)行導(dǎo)航時(shí),往往導(dǎo)致N+1條SQL語句查詢。
例:
    A.應(yīng)用于對象關(guān)聯(lián)實(shí)例(默認(rèn)為1),注意,對對象關(guān)聯(lián)實(shí)例的設(shè)置是在被關(guān)聯(lián)的對象之上的,譬如

  1. class User  
  2. {  
  3.     Group g;  

那么抓取粒度應(yīng)該在Group的配置文件之上,見下

  1. <class name="Group" table="group" batch-size="..">  
  2.     ...  
  3. class

對該值并沒有一個(gè)約定俗成的值,根據(jù)情況而定,如果被關(guān)聯(lián)表數(shù)據(jù)比較少,則可以設(shè)置地小一些,3-20,如果比較大則可以設(shè)到30-50,注意的時(shí)候,并不是越多越好,當(dāng)其值超過50之后,對性能并沒有多大改善但卻無謂地消耗內(nèi)存
假設(shè)有如下例子:
       List users = query.list();
如果有20個(gè)User,并對這20個(gè)User及其Group進(jìn)行遍歷,如果不設(shè)置batch-size(即batch-size="1"),則在最糟糕的情況下,需要1 + 20條SQL語句,如果設(shè)置batch-size="10",則最好的情況下只需要1 + 2條SQL語句
B.應(yīng)用于對象關(guān)聯(lián)集合(默認(rèn)為1)

  1. ".." batch-size="" ... >  
  2.    ....  
  3.  

2.Hibernate性能優(yōu)化之二級緩存優(yōu)化
Hibernate對數(shù)據(jù)的緩存包括兩個(gè)級:一級緩存,在Session的級別上進(jìn)行,主要是對象緩存,以其id為鍵保存對象,在Session的生命期間存在;二級緩存,在SessionFactory的級別上進(jìn)行,有對象緩存和查詢緩存,查詢緩存以查詢條件為鍵保存查詢結(jié)果,在SessionFactory的生命期間存在。默認(rèn)地,Hibernate只啟用一級緩存,通過正確地使用二級緩存,往往可以獲得意想不到的性能。
1)對象緩存:
當(dāng)抓取一個(gè)對象之后,Hiberate將其以id為鍵緩存起來,當(dāng)下次碰到抓取id相同的對象時(shí),可以使用如下配置
方法1:在緩存對象上配置

  1. <class ...>  
  2.    "read-only/write/...." regions="group" />  
  3. class

useage表示使用什么類型的緩存,譬如只讀緩存、讀寫緩存等等(具體參見Hibernate參考指南),值得注意的時(shí),有部分緩存在Hibernate的實(shí)現(xiàn)中不支持讀寫緩存,譬如JBossCache在Hibernate的實(shí)現(xiàn)中只是一種只讀緩存,具體緩存實(shí)現(xiàn)對緩存類型的支持情況,可以參見org.hibernate.cache包
regions表示緩存分塊,大部分的緩存實(shí)現(xiàn)往往對緩存進(jìn)行分塊,該部分是可選的,詳細(xì)參見各緩存實(shí)現(xiàn)
方法2:在hibernate.cfg.xml中配置
   
我認(rèn)為第二種更好,可以統(tǒng)一管理
2)查詢緩存
    查詢時(shí)候?qū)⒉樵兘Y(jié)果以查詢條件為鍵保存起來,需要配置如下
A.在hibernate.cfg.xml中配置(啟用查詢緩存)

  1. "hibernate.cache.use_query_cache">true   

(前面的屬性名可參見常量
org.hibernate.cfg.Enviroment.USE_QUERY_CACHE)
B.程序

  1. query.setCacheable(true);  
  2. query.setCacheRegions(...); 

需要注意的是,查詢緩存與對象緩存要結(jié)合更有效,因?yàn)椴樵兙彺鎯H緩存查詢結(jié)果列表的主鍵數(shù)據(jù)
一般情況下在開發(fā)中,對一些比較穩(wěn)定而又被頻繁引用的數(shù)據(jù),譬如數(shù)據(jù)字典之類的,將其進(jìn)行二級緩存,對一些查詢條件和查詢數(shù)據(jù)變化不頻繁而又常常被使用的查詢,將其進(jìn)行二級緩存。由于二級緩存是放在內(nèi)存中,而且Hibernate的緩存不是弱引用緩存(WeekReference),所以注意不要將大塊的數(shù)據(jù)放入其中,否則可能會被內(nèi)存造成比較大的壓力。

3.Hibernate性能優(yōu)化之批量數(shù)據(jù)操作優(yōu)化
當(dāng)進(jìn)行大批量數(shù)據(jù)操作(幾萬甚至幾十幾百萬)時(shí),需要注意兩點(diǎn),一,批量提交,二,及時(shí)清除不需要的一級緩存數(shù)據(jù)
1)所謂的批量提交,就是不要頻繁使用session的flush,每一次進(jìn)行flush,Hibernate將PO數(shù)據(jù)于數(shù)據(jù)庫進(jìn)行同步,對于海量級數(shù)據(jù)操作來說是性能災(zāi)難(同時(shí)提交幾千條數(shù)據(jù)和提交一條數(shù)據(jù)flush一次性能差別可能會是幾十倍的差異)。一般將數(shù)據(jù)操作放在事務(wù)中,當(dāng)事務(wù)提交時(shí)Hibernate自動幫你進(jìn)行flush操作。
2)及時(shí)清除不需要的一級緩存數(shù)據(jù):由于Hibernate默認(rèn)采用一級緩存,而在session的生命期間,所有數(shù)據(jù)抓取之后會放入一級緩存中,而當(dāng)數(shù)據(jù)規(guī)模比較龐大時(shí),抓取到內(nèi)存中的數(shù)據(jù)會讓內(nèi)存壓力非常大,一般分批操作數(shù)據(jù),被一次操作之后將一級緩存清除,譬如:

  1. session.clear(User.class

4.雜項(xiàng)
dynamic-insert,dynamic-update,動態(tài)插入和動態(tài)更新,指的是讓Hibernate插入數(shù)據(jù)時(shí)僅插入非空數(shù)據(jù),當(dāng)修改數(shù)據(jù)時(shí)只修改變化的數(shù)據(jù),譬如對于

  1. class User  
  2. {  
  3.    id  
  4.    username  
  5.    password  

如果u.id=1, u.username="ayufox",u.password=null,那么如果不設(shè)置動態(tài)插入,則其sql語句是insert into users(id, username, password) values (1, 'ayufox', '),如果設(shè)置則其sql語句是insert into users(username) valeus('ayufox')
在如上的情況下,如果修改u.password='11',那么如果不設(shè)置動態(tài)更新,則sql語句為update users set username='ayufox', password='11' where id = 1,如果設(shè)置則為update user set password='11' where d = 1
設(shè)置是在class的映射文件中,如下

  1. <class name="User" table="users" dynamic=insert="true/false" dynamic-update="true/false" ...>  
  2. class

該設(shè)置對性能的提升比較有限

 

【編輯推薦】

  1. 初學(xué)者適用的Hibernate學(xué)習(xí)方法
  2. Hibernate實(shí)戰(zhàn)(第2版)讀書筆記
  3. Hibernate一對多關(guān)系的處理
  4. 十五道Hibernate面試題及答案
  5. Hibernate的性能優(yōu)化
責(zé)任編輯:仲衡 來源: CSDN博客
相關(guān)推薦

2009-06-16 16:39:49

Hibernate性能

2009-06-06 15:37:22

Hibernate性能

2009-09-22 15:22:08

Hibernate性能

2009-09-22 17:25:41

優(yōu)化Hibernate

2009-09-25 13:10:15

Hibernate性能

2009-03-16 16:00:19

HibernateJ2EE配置

2009-06-16 16:27:22

Hibernate優(yōu)化

2009-09-22 12:45:00

Hibernate性能

2009-09-22 17:41:07

Hibernate性能

2009-06-12 15:09:01

Hibernate優(yōu)化

2009-06-17 08:47:00

Hibernate優(yōu)化

2009-09-25 08:49:22

Hibernate集合

2009-06-18 11:12:42

Hibernate S優(yōu)化

2025-06-03 00:00:06

性能優(yōu)化性能指標(biāo)響應(yīng)時(shí)間

2009-09-27 14:56:22

Hibernate H

2009-09-23 12:48:54

Hibernate I

2009-09-24 13:45:53

Hibernate性能

2009-07-06 18:29:55

2014-12-10 10:12:02

Web

2011-08-03 16:51:01

jQuery
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 自拍 亚洲 欧美 老师 丝袜 | 日韩欧美大片在线观看 | 四虎影音| 91精品在线观看入口 | 日日操夜夜操天天操 | 99免费视频 | 亚洲国产情侣自拍 | 亚洲天堂成人在线视频 | 国产精品完整版 | 欧美日韩网站 | av在线一区二区三区 | 久久四虎 | 国产精品一区二区三区久久 | 日韩电影一区二区三区 | 国产精品18久久久久久久 | 精品成人免费一区二区在线播放 | 狠狠入ady亚洲精品经典电影 | 日日天天| 一级毛片播放 | 成人a免费| 正在播放国产精品 | 亚洲精品一区二区在线观看 | 久久久久久久久中文字幕 | 亚洲久草视频 | 久久久久国产精品一区二区 | 成人看片在线观看 | 一级全黄少妇性色生活免费看 | 亚洲国产精品久久久 | 91资源在线 | 久操av在线 | 国产色 | 老司机67194精品线观看 | 黑人精品欧美一区二区蜜桃 | 国产一区 | 国产激情精品一区二区三区 | 福利视频网 | 欧美男人天堂 | 亚洲福利av | 国产亚洲精品精品国产亚洲综合 | 久久成人免费 | 国产精品免费福利 |