国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Hibernate優化方法解析

開發 后端
本文對Hibernate優化方法進行了總結、介紹和解析,文章分為五個方面:批量修改和刪除、使用SQL執行批量操作 、提升數據庫查詢的性能 、使用正確的抓取策略和查詢性能提升小結五個部分。

Hibernate優化方法一:批量修改和刪除

在Hibernate 2中,如果需要對任何數據進行修改和刪除操作,都需要先執行查詢操作,在得到要修改或者刪除的數據后,再對該數據進行相應的操作處理。在數據量少的情況下采用這種處理方式沒有問題,但需要處理大量數據的時候就可能存在以下的問題:

◆占用大量的內存。

◆需要多次執行update/delete語句,而每次執行只能處理一條數據。

以上兩個問題的出現會嚴重影響系統的性能。因此,在Hibernate 3中引入了用于批量更新或者刪除數據的HQL語句。這樣,開發人員就可以一次更新或者刪除多條記錄,而不用每次都一個一個地修改或者刪除記錄了。

如果要刪除所有的User對象(也就是User對象所對應表中的記錄),則可以直接使用下面的HQL語句:

delete User

而在執行這個HQL語句時,需要調用Query對象的executeUpdate()方法,具體的實例如下所示:

String HQL="delete User";

Query query=session.createQuery(HQL);

int size=query.executeUpdate();

采用這種方式進行數據的修改和刪除時與直接使用JDBC的方式在性能上相差無幾,是推薦使用的正確方法。

如果不能采用HQL語句進行大量數據的修改,也就是說只能使用取出再修改的方式時,也會遇到批量插入時的內存溢出問題,所以也要采用上面所提供的處理方法來進行類似的處理。

Hibernate優化方法二:使用SQL執行批量操作

在進行批量插入、修改和刪除操作時,直接使用JDBC來執行原生態的SQL語句無疑會獲得最佳的性能,這是因為在處理的過程中省略或者簡化了以下處理內容:

● HQL語句到SQL語句的轉換。

● Java對象的初始化。

● Java對象的緩存處理。

但是在直接使用JDBC執行SQL語句時,有一個最重要的問題就是要處理緩存中的Java對象。因為通過這種底層方式對數據的修改將不能通知緩存去進行相應的更新操作,以保證緩存中的對象與數據庫中的數據是一致的。

Hibernate優化方法三:提升數據庫查詢的性能

數據庫查詢性能的提升也是涉及到開發中的各個階段,在開發中選用正確的查詢方法無疑是最基礎也最簡單的。

1 、SQL語句的優化

使用正確的SQL語句可以在很大程度上提高系統的查詢性能。獲得同樣數據而采用不同方式的SQL語句在性能上的差距可能是十分巨大的。

由于Hibernate是對JDBC的封裝,SQL語句的產生都是動態由Hibernate自動完成的。Hibernate產生SQL語句的方式有兩種:一種是通過開發人員編寫的HQL語句來生成,另一種是依據開發人員對關聯對象的訪問來自動生成相應的SQL語句。

至于使用什么樣的SQL語句可以獲得更好的性能要依據數據庫的結構以及所要獲取數據的具體情況來進行處理。在確定了所要執行的SQL語句后,可以通過以下三個方面來影響Hibernate所生成的SQL語句:

◆HQL語句的書寫方法。

◆查詢時所使用的查詢方法。

◆對象關聯時所使用的抓取策略。

2 、使用正確的查詢方法

在前面已經介紹過,執行數據查詢功能的基本方法有兩種:一種是得到單個持久化對象的get()方法和load()方法,另一種是Query對象的list()方法和iterator()方法。在開發中應該依據不同的情況選用正確的方法。

get()方法和load()方法的區別在于對二級緩存的使用上。load()方法會使用二級緩存,而get()方法在一級緩存沒有找到的情況下會直接查詢數據庫,不會去二級緩存中查找。在使用中,對使用了二級緩存的對象進行查詢時最好使用load()方法,以充分利用二級緩存來提高檢索的效率。

list()方法和iterator()方法之間的區別可以從以下幾個方面來進行比較。

◆執行的查詢不同

list()方法在執行時,是直接運行查詢結果所需要的查詢語句,而iterator()方法則是先執行得到對象ID的查詢,然后再根據每個ID值去取得所要查詢的對象。因此,對于list()方式的查詢通常只會執行一個SQL語句,而對于iterator()方法的查詢則可能需要執行N+1條SQL語句(N為結果集中的記錄數)。

iterator()方法只是可能執行N+1條數據,具體執行SQL語句的數量取決于緩存的情況以及對結果集的訪問情況。

◆緩存的使用

list()方法只能使用二級緩存中的查詢緩存,而無法使用二級緩存對單個對象的緩存(但是會把查詢出的對象放入二級緩存中)。所以,除非重復執行相同的查詢操作,否則無法利用緩存的機制來提高查詢的效率。

iterator()方法則可以充分利用二級緩存,在根據ID檢索對象的時候會首先到緩存中查找,只有在找不到的情況下才會執行相應的查詢語句。所以,緩存中對象的存在與否會影響到SQL語句的執行數量。

◆對于結果集的處理方法不同

list()方法會一次獲得所有的結果集對象,而且它會依據查詢的結果初始化所有的結果集對象。這在結果集非常大的時候必然會占據非常多的內存,甚至會造成內存溢出情況的發生。

iterator()方法在執行時不會一次初始化所有的對象,而是根據對結果集的訪問情況來初始化對象。因此在訪問中可以控制緩存中對象的數量,以避免占用過多緩存,導致內存溢出情況的發生。使用iterator()方法的另外一個好處是,如果只需要結果集中的部分記錄,那么沒有被用到的結果對象根本不會被初始化。所以,對結果集的訪問情況也是調用iterator()方法時執行數據庫SQL語句多少的一個因素。

所以,在使用Query對象執行數據查詢時應該從以上幾個方面去考慮使用何種方法來執行數據庫的查詢操作。

Hibernate優化方法四:使用正確的抓取策略

所謂抓取策略(fetching strategy)是指當應用程序需要利用關聯關系進行對象獲取的時候,Hibernate獲取關聯對象的策略。抓取策略可以在O/R映射的元數據中聲明,也可以在特定的HQL或條件查詢中聲明。

Hibernate 3定義了以下幾種抓取策略。

連接抓取(Join fetching)

連接抓取是指Hibernate在獲得關聯對象時會在SELECT語句中使用外連接的方式來獲得關聯對象。

查詢抓取(Select fetching)

查詢抓取是指Hibernate通過另外一條SELECT語句來抓取當前對象的關聯對象的方式。這也是通過外鍵的方式來執行數據庫的查詢。與連接抓取的區別在于,通常情況下這個SELECT語句不是立即執行的,而是在訪問到關聯對象的時候才會執行。

子查詢抓取(Subselect fetching)

子查詢抓取也是指Hibernate通過另外一條SELECT語句來抓取當前對象的關聯對象的方式。與查詢抓取的區別在于它所采用的SELECT語句的方式為子查詢,而不是通過外連接。

批量抓取(Batch fetching)

批量抓取是對查詢抓取的優化,它會依據主鍵或者外鍵的列表來通過單條SELECT語句實現管理對象的批量抓取。

以上介紹的是Hibernate 3所提供的抓取策略,也就是抓取關聯對象的手段。為了提升系統的性能,在抓取關聯對象的時機上,還有以下一些選擇。
立即抓取(Immediate fetching)

立即抓取是指宿主對象被加載時,它所關聯的對象也會被立即加載。

延遲集合抓取(Lazy collection fetching)

延遲集合抓取是指在加載宿主對象時,并不立即加載它所關聯的對象,而是到應用程序訪問關聯對象的時候才抓取關聯對象。這是集合關聯對象的默認行為。

延遲代理抓取(Lazy proxy fetching)

延遲代理抓取是指在返回單值關聯對象的情況下,并不在對其進行get操作時抓取,而是直到調用其某個方法的時候才會抓取這個對象。

延遲屬性加載(Lazy attribute fetching)

延遲屬性加載是指在關聯對象被訪問的時候才進行關聯對象的抓取。

介紹了Hibernate所提供的關聯對象的抓取方法和抓取時機,這兩個方面的因素都會影響Hibernate的抓取行為,最重要的是要清楚這兩方面的影響是不同的,不要將這兩個因素混淆,在開發中要結合實際情況選用正確的抓取策略和合適的抓取時機。

◆抓取時機的選擇

在Hibernate 3中,對于集合類型的關聯在默認情況下會使用延遲集合加載的抓取時機,而對于返回單值類型的關聯在默認情況下會使用延遲代理抓取的抓取時機。

對于立即抓取在開發中很少被用到,因為這很可能會造成不必要的數據庫操作,從而影響系統的性能。當宿主對象和關聯對象總是被同時訪問的時候才有可能會用到這種抓取時機。另外,使用立即連接抓取可以通過外連接來減少查詢SQL語句的數量,所以,也會在某些特殊的情況下使用。

然而,延遲加載又會面臨另外一個問題,如果在Session關閉前關聯對象沒有被實例化,那么在訪問關聯對象的時候就會拋出異常。處理的方法就是在事務提交之前就完成對關聯對象的訪問。

所以,在通常情況下都會使用延遲的方式來抓取關聯的對象。因為每個立即抓取都會導致關聯對象的立即實例化,太多的立即抓取關聯會導致大量的對象被實例化,從而占用過多的內存資源。

◆抓取策略的選取

對于抓取策略的選取將影響到抓取關聯對象的方式,也就是抓取關聯對象時所執行的SQL語句。這就要根據實際的業務需求、數據的數量以及數據庫的結構來進行選擇了。

在這里需要注意的是,通常情況下都會在執行查詢的時候針對每個查詢來指定對其合適的抓取策略。指定抓取策略的方法如下所示:

User user = (User) session.createCriteria(User.class)

.setFetchMode("permissions", FetchMode.JOIN)

.add( Restrictions.idEq(userId) )

.uniqueResult();

Hibernate優化方法五:查詢性能提升小結

在本小節中介紹了查詢性能提升的方法,關鍵是如何通過優化SQL語句來提升系統的查詢性能。查詢方法和抓取策略的影響也是通過執行查詢方式和SQL語句的多少來改變系統的性能的。這些都屬于開發人員所應該掌握的基本技能,避免由于開發不當而導致系統性能的低下。

在性能調整中,除了前面介紹的執行SQL語句的因素外,對于緩存的使用也會影響系統的性能。通常來說,緩存的使用會增加系統查詢的性能,而降低系統增加、修改和刪除操作的性能(因為要進行緩存的同步處理)。所以,開發人員應該能夠正確地使用有效的緩存來提高數據查詢的性能,而要避免濫用緩存而導致的系統性能變低。在采用緩存的時候也應該注意調整自己的檢索策略和查詢方法,這三者配合起來才可以達到最優的性能。

另外,事務的使用策略也會影響到系統的性能。選取正確的事務隔離級別以及使用。

責任編輯:仲衡 來源: hulongzhou博客
相關推薦

2009-06-12 15:09:01

Hibernate優化

2009-09-24 13:25:58

Hibernate m

2009-06-16 16:10:59

Hibernate性能

2009-06-06 15:37:22

Hibernate性能

2009-06-17 08:47:00

Hibernate優化

2009-06-16 16:39:49

Hibernate性能

2009-09-23 15:12:41

Hibernate視圖

2009-06-18 09:14:08

Hibernate H

2010-06-07 09:11:43

jQuery

2009-06-18 11:12:42

Hibernate S優化

2009-09-22 17:25:41

優化Hibernate

2009-09-22 15:22:08

Hibernate性能

2009-09-25 13:10:15

Hibernate性能

2009-06-11 14:40:59

Hibernate分頁Hibernate查詢

2009-09-22 10:50:04

Hibernate c

2009-09-23 16:54:08

Hibernate修改

2009-09-23 09:47:23

Hibernate e

2009-09-27 14:41:05

Hibernate I

2009-09-27 14:56:22

Hibernate H

2009-03-16 16:00:19

HibernateJ2EE配置
點贊
收藏

51CTO技術棧公眾號

欧美一区二区免费观在线| 91麻豆免费在线视频| 性欧美1819sex性高清大胸| 国产成人免费视频精品含羞草妖精| 91麻豆精品久久久久蜜臀 | 欧美日韩久久一区二区| 欧美一区二区中文字幕| 天堂99x99es久久精品免费| 日韩美女一区二区三区| 国产羞羞视频在线观看| 国产激情精品久久久第一区二区| 亚洲伊人一本大道中文字幕| 精品三级av在线导航| 久久中国妇女中文字幕| 成人在线免费电影网站| 亚洲成人中文在线| 色多多视频在线播放| 国产人成亚洲第一网站在线播放 | 日韩免费一级视频| 福利一区福利二区| www.亚洲成人网| 不卡视频免费播放| 97超碰青青草| 国产三级一区二区三区| 欧美性猛交久久久乱大交小说| 99riav久久精品riav| 日韩欧美精品在线观看视频| 国产精品一区二区视频| 欧美三级一级片| 国产喷白浆一区二区三区| xxx亚洲日本| 欧美性20hd另类| aaa日本高清在线播放免费观看| 欧美另类z0zxhd电影| 超碰在线97国产| 久久久久日韩精品久久久男男| 成人在线视频中文字幕| 欧美在线一级视频| 91亚洲人成网污www| 国产亚洲欧美另类一区二区三区| 天堂成人国产精品一区| 国产爆乳无码一区二区麻豆 | 无码aⅴ精品一区二区三区浪潮| 欧美极品少妇xxxxⅹ高跟鞋| 亚洲综合图片| 亚洲区中文字幕| 久久久综合色| 91免费版网站入口| 国产精品系列在线观看| 久草在线新资源| 精品国产免费人成在线观看| 黄色在线播放| 中文字幕亚洲电影| 精品国产丝袜高跟鞋| 国内精品小视频在线观看| 欧美资源在线| 午夜宅男在线视频| 欧美大胆人体bbbb| 婷婷综合在线| 99sesese| 国产一区二区三区在线免费观看 | 在线观看一区二区三区三州| 免费在线观看视频一区| 国产日韩欧美在线观看| 亚洲欧美韩国| 一区二区三区在线视频播放| 成人在线看片网站| 麻豆久久一区二区| 国产精品青草久久久久福利99| 亚洲七七久久综合桃花剧情介绍| 成人免费观看男女羞羞视频| 岛国视频一区| crdy在线观看欧美| 国产97在线|亚洲| 成人自拍av| 欧洲亚洲一区| 欧美一级片在线看| 精品69视频一区二区三区Q| 在线观看国产视频一二三| 久久色精品视频| 自产国语精品视频| 亚洲综合自拍一区| 136国产福利精品导航网址| 日本欧美国产在线| 成人影视在线播放| 亚洲免费在线观看视频| 日本精品一区二区三区四区| 中文国产一区| 国产精品白嫩初高中害羞小美女| 黄色影院在线看| 欧美日韩aaa| 中文日本高清免费| 亚洲欧洲色图综合| 国产中文在线播放| www成人免费| 欧美综合激情网| 欧美日韩美少妇| fc2成人免费人成在线观看播放| 外国成人直播| 国产一级特黄a大片免费| 欧美在线日韩在线| 色婷婷亚洲综合| 国产91色综合久久免费分享| 校花撩起jk露出白色内裤国产精品| 久草在线看片| 日韩国产小视频| 欧美在线一级视频| 日韩一级精品视频在线观看| 99免费精品视频| 99久久婷婷国产综合精品电影√| 中文在线视频| 国产黄色特级片| 国产精品久久久久久久久婷婷| 亚洲精品永久免费精品| 中文字幕一区二区三区在线不卡| 亚洲理伦在线| 一区二区三区日本久久久| 91高清视频在线观看| 超碰在线免费看| 成人三级视频在线播放 | 成人va天堂| 天堂а√在线资源在线| 97看剧电视剧大全| 少妇高潮大叫好爽喷水| 日日狠狠久久偷偷四色综合免费| 国产馆精品极品| 亚洲精品美女91| 欧美日韩在线网站| va天堂va亚洲va影视| av在线网页| 亚洲不卡中文字幕无码| 亚洲 日韩 国产第一| 亚洲最新中文字幕| 亚洲女人天堂成人av在线| 欧美一区二区性放荡片| 日本韩国精品在线| 国产三级三级三级精品8ⅰ区| 久久国产精品色| 免费看日韩精品| 日韩高清中文字幕一区| 最新国产乱人伦偷精品免费网站| 欧美精品第一区| 亚洲一区二区免费在线观看| 91麻豆精品| 国产乱人伦精品一区| 亚洲裸色大胆大尺寸艺术写真| 欧美挤奶吃奶水xxxxx| 久久国产影院| 99国产**精品****| 亚洲精品一二| 成人性生交大片免费看中文 | 精品日产卡一卡二卡麻豆| 精品少妇一区二区三区免费观看| 亚洲国产精品va在线观看黑人| 亚洲欧美综合另类中字| 久久99国产综合精品女同| 51色欧美片视频在线观看| 亚洲一区制服诱惑| 日韩欧美xxxx| 免费看的黄色大片| siro系绝美精品系列| av在线免费观看网站| 亚洲精品成人一区| 欧美一区在线看| 成人激情综合网站| 香蕉久久一区二区不卡无毒影院| 欧美不卡一区二区| 午夜欧美不卡精品aaaaa| 亚洲国产美女| 99精品欧美一区| 亚洲综合男人的天堂| 日韩欧美电影在线| 国产精品va在线播放我和闺蜜| 国产伦精品一区二区三区四区免费| 免费视频爱爱太爽了| 在线免费观看色| 看亚洲a级一级毛片| 亚洲茄子视频| 一区二区成人在线观看| 日韩久久精品电影| 精品国产第一页| 男女激情视频网站| 亚洲美女色播| 国产二区国产一区在线观看| 欧美三片在线视频观看| 欧美一级电影在线| 久久久久久久久久久久久久国产| 亚洲xxxxxx| 国产亚洲激情| 亚洲欧洲三级电影| 亚洲天天做日日做天天谢日日欢| 日韩av在线免费看| 成人免费激情视频| 在线观看av网| 亚洲精品一区二区在线看| 亚洲资源中文字幕| 国产欧美精品日韩精品| 一个人看的免费视频色| 精品国产a一区二区三区v免费| 亚洲私人影院在线观看|