hibernate中文翻譯,hibernate是什么意思,hibernate發(fā)音、用法及例句
- 內容導航:
- 1、hibernate
- 2、hibernate優(yōu)化方案
1、hibernate
hibernate發(fā)音
英:[?ha?b?rne?t] 美:[?ha?b?ne?t]
英: 美:
hibernate中文意思翻譯
常用釋義:冬眠
n.(Hibernate)開(kāi)放源代碼的對象關(guān)系映射框架
vi.(動(dòng)物或植物)過(guò)冬,冬眠;(人)蟄居,不活動(dòng)
hibernate變形
第三人稱(chēng)單數--hibernates;現在分詞--hibernating;過(guò)去式--hibernated;過(guò)去分詞--hibernated。
hibernate雙語(yǔ)使用場(chǎng)景
1、With Hibernate, you take an existing model and an existing schema and express a map between them using annotations or XML.───通過(guò)Hibernate,您可獲取現有的模型和模式并使用注釋或XML表達二者之間的映射。
2、InfoQ: The specification is quite heavily influenced by the Hibernate Validation but the group concept seems to be something of a departure.───InfoQ:規范受Hibernate驗證框架的影響比較大,但是組的概念似乎不是。
3、My current pet name for her is "bear" because she has to hibernate every night.───我現在給她的愛(ài)稱(chēng)是“熊熊”,因為她每天晚上都要冬眠。
4、Also be aware that this feature bypasses Hibernate's usual optimistic locking strategy for versioned data.───此外,還要注意,該特性會(huì )繞過(guò)Hibernate對版本數據(versioneddata)的常用樂(lè )觀(guān)鎖策略。
5、Millions of butterflies hibernate in trees and wake up in March to fly to the north, the United States.───蝴蝶在樹(shù)木休眠和喚醒三月高達數以百萬(wàn)計飛往北方,美國。
6、You could install the Hibernate plug-in, or do as the error message tells you and set def transactional = false in your integration test.───您可以安裝Hibernate插件,或者按照錯誤消息的指示在集成測試中設置deftransactional=false。
7、With Hibernate, you can define an HQL query in a Hibernate mapping file (hbm. xml) and give it a name.───使用Hibernate,可以在Hibernate映射文件(hbm.xml)中定義HQL查詢(xún)并為其命名。
8、hibernate in caves.───里冬眠。
9、When the winter winds blow, some of us would rather hibernate than work out.───當冬天的風(fēng)吹來(lái)的時(shí)候,我們中的一些人寧愿冬眠也不愿出去工作。
hibernate相似詞語(yǔ)短語(yǔ)
1、hibernator───冬眠動(dòng)物
2、hibernates───冬眠
3、hibernal───adj.寒冷的;冬天的
4、hibernated───v.過(guò)冬,(動(dòng)物)冬眠(hibernate的過(guò)去式和過(guò)去分詞)
5、hibernacle───n.動(dòng)物冬眠的地方
6、cybernate───vt.使電腦化;vi.電腦化,自動(dòng)控制化
7、hibernize───冬眠
8、hibernise───冬眠
9、to hibernate───冬眠
2、hibernate優(yōu)化方案
一 批量修改和刪除
在Hibernate 中 如果需要對任何數據進(jìn)行修改和刪除操作 都需要先執行查詢(xún)操作 在得到要修改或者刪除的數據后 再對該數據進(jìn)行相應的操作處理 在數據量少的情況下采用這種處理方式?jīng)]有問(wèn)題 但需要處理大量數據的時(shí)候就可能存在以下的問(wèn)題
占用大量的內存
需要多次執行update/delete語(yǔ)句 而每次執行只能處理一條數據
以上兩個(gè)問(wèn)題的出現會(huì )嚴重影響系統的性能 因此 在Hibernate 中引入了用于批量更新或者刪除數據的HQL語(yǔ)句 這樣 開(kāi)發(fā)人員就可以一次更新或者刪除多條記錄 而不用每次都一個(gè)一個(gè)地修改或者刪除記錄了
如果要刪除所有的User對象(也就是User對象所對應表中的記錄) 則可以直接使用下面的HQL語(yǔ)句
delete User
而在執行這個(gè)HQL語(yǔ)句時(shí) 需要調用Query對象的executeUpdate()方法 具體的實(shí)例如下所示
String HQL= delete User ;
Query query=session createQuery(HQL);
int size=query executeUpdate();
采用這種方式進(jìn)行數據的修改和刪除時(shí)與直接使用JDBC的方式在性能上相差無(wú)幾 是推薦使用的正確方法
如果不能采用HQL語(yǔ)句進(jìn)行大量數據的修改 也就是說(shuō)只能使用取出再修改的方式時(shí) 也會(huì )遇到批量插入時(shí)的內存溢出問(wèn)題 所以也要采用上面所提供的處理方法來(lái)進(jìn)行類(lèi)似的處理
二 使用SQL執行批量操作
在進(jìn)行批量插入 修改和刪除操作時(shí) 直接使用JDBC來(lái)執行原生態(tài)的SQL語(yǔ)句無(wú)疑會(huì )獲得最佳的性能 這是因為在處理的過(guò)程中省略或者簡(jiǎn)化了以下處理內容
● HQL語(yǔ)句到SQL語(yǔ)句的轉換
● Java對象的初始化
● Java對象的緩存處理
但是在直接使用JDBC執行SQL語(yǔ)句時(shí) 有一個(gè)最重要的問(wèn)題就是要處理緩存中的Java對象 因為通過(guò)這種底層方式對數據的修改將不能通知緩存去進(jìn)行相應的更新操作 以保證緩存中的對象與數據庫中的數據是一致的
三 提升數據庫查詢(xún)的性能
數據庫查詢(xún)性能的提升也是涉及到開(kāi)發(fā)中的各個(gè)階段 在開(kāi)發(fā)中選用正確的查詢(xún)方法無(wú)疑是最基礎也最簡(jiǎn)單的
SQL語(yǔ)句的優(yōu)化
使用正確的SQL語(yǔ)句可以在很大程度上提高系統的查詢(xún)性能 獲得同樣數據而采用不同方式的SQL語(yǔ)句在性能上的差距可能是十分巨大的
由于Hibernate是對JDBC的封裝 SQL語(yǔ)句的產(chǎn)生都是動(dòng)態(tài)由Hibernate自動(dòng)完成的 Hibernate產(chǎn)生SQL語(yǔ)句的方式有兩種 一種是通過(guò)開(kāi)發(fā)人員編寫(xiě)的HQL語(yǔ)句來(lái)生成 另一種是依據開(kāi)發(fā)人員對關(guān)聯(lián)對象的訪(fǎng)問(wèn)來(lái)自動(dòng)生成相應的SQL語(yǔ)句
至于使用什么樣的SQL語(yǔ)句可以獲得更好的性能要依據數據庫的結構以及所要獲取數據的具體情況來(lái)進(jìn)行處理 在確定了所要執行的SQL語(yǔ)句后 可以通過(guò)以下三個(gè)方面來(lái)影響Hibernate所生成的SQL語(yǔ)句
HQL語(yǔ)句的書(shū)寫(xiě)方法
查詢(xún)時(shí)所使用的查詢(xún)方法
對象關(guān)聯(lián)時(shí)所使用的抓取策略
使用正確的查詢(xún)方法
在前面已經(jīng)介紹過(guò) 執行數據查詢(xún)功能的基本方法有兩種 一種是得到單個(gè)持久化對象的get()方法和load()方法 另一種是Query對象的list()方法和iterator()方法 在開(kāi)發(fā)中應該依據不同的情況選用正確的方法
get()方法和load()方法的區別在于對二級緩存的使用上 load()方法會(huì )使用二級緩存 而get()方法在一級緩存沒(méi)有找到的情況下會(huì )直接查詢(xún)數據庫 不會(huì )去二級緩存中查找 在使用中 對使用了二級緩存的對象進(jìn)行查詢(xún)時(shí)最好使用load()方法 以充分利用二級緩存來(lái)提高檢索的效率
list()方法和iterator()方法之間的區別可以從以下幾個(gè)方面來(lái)進(jìn)行比較
執行的查詢(xún)不同
list()方法在執行時(shí) 是直接運行查詢(xún)結果所需要的查詢(xún)語(yǔ)句 而iterator()方法則是先執行得到對象ID的查詢(xún) 然后再根據每個(gè)ID值去取得所要查詢(xún)的對象 因此 對于list()方式的查詢(xún)通常只會(huì )執行一個(gè)SQL語(yǔ)句 而對于iterator()方法的查詢(xún)則可能需要執行N+ 條SQL語(yǔ)句(N為結果集中的記錄數)
iterator()方法只是可能執行N+ 條數據 具體執行SQL語(yǔ)句的數量取決于緩存的情況以及對結果集的訪(fǎng)問(wèn)情況
緩存的使用
list()方法只能使用二級緩存中的查詢(xún)緩存 而無(wú)法使用二級緩存對單個(gè)對象的緩存(但是會(huì )把查詢(xún)出的對象放入二級緩存中) 所以 除非重復執行相同的查詢(xún)操作 否則無(wú)法利用緩存的機制來(lái)提高查詢(xún)的效率
iterator()方法則可以充分利用二級緩存 在根據ID檢索對象的時(shí)候會(huì )首先到緩存中查找 只有在找不到的情況下才會(huì )執行相應的查詢(xún)語(yǔ)句 所以 緩存中對象的存在與否會(huì )影響到SQL語(yǔ)句的執行數量
對于結果集的處理方法不同
list()方法會(huì )一次獲得所有的結果集對象 而且它會(huì )依據查詢(xún)的結果初始化所有的結果集對象 這在結果集非常大的時(shí)候必然會(huì )占據非常多的內存 甚至會(huì )造成內存溢出情況的發(fā)生
iterator()方法在執行時(shí)不會(huì )一次初始化所有的對象 而是根據對結果集的訪(fǎng)問(wèn)情況來(lái)初始化對象 因此在訪(fǎng)問(wèn)中可以控制緩存中對象的數量 以避免占用過(guò)多緩存 導致內存溢出情況的發(fā)生 使用iterator()方法的另外一個(gè)好處是 如果只需要結果集中的部分記錄 那么沒(méi)有被用到的結果對象根本不會(huì )被初始化 所以 對結果集的訪(fǎng)問(wèn)情況也是調用iterator()方法時(shí)執行數據庫SQL語(yǔ)句多少的一個(gè)因素
所以 在使用Query對象執行數據查詢(xún)時(shí)應該從以上幾個(gè)方面去考慮使用何種方法來(lái)執行數據庫的查詢(xún)操作
四 使用正確的抓取策略
所謂抓取策略(fetching strategy)是指當應用程序需要利用關(guān)聯(lián)關(guān)系進(jìn)行對象獲取的時(shí)候 Hibernate獲取關(guān)聯(lián)對象的策略 抓取策略可以在O/R映射的元數據中聲明 也可以在特定的HQL或條件查詢(xún)中聲明
Hibernate 定義了以下幾種抓取策略
連接抓取(Join fetching)
連接抓取是指Hibernate在獲得關(guān)聯(lián)對象時(shí)會(huì )在SELECT語(yǔ)句中使用外連接的方式來(lái)獲得關(guān)聯(lián)對象
查詢(xún)抓取(Select fetching)
查詢(xún)抓取是指Hibernate通過(guò)另外一條SELECT語(yǔ)句來(lái)抓取當前對象的關(guān)聯(lián)對象的方式 這也是通過(guò)外鍵的方式來(lái)執行數據庫的查詢(xún) 與連接抓取的區別在于 通常情況下這個(gè)SELECT語(yǔ)句不是立即執行的 而是在訪(fǎng)問(wèn)到關(guān)聯(lián)對象的時(shí)候才會(huì )執行
子查詢(xún)抓取(Subselect fetching)
子查詢(xún)抓取也是指Hibernate通過(guò)另外一條SELECT語(yǔ)句來(lái)抓取當前對象的關(guān)聯(lián)對象的方式 與查詢(xún)抓取的區別在于它所采用的SELECT語(yǔ)句的方式為子查詢(xún) 而不是通過(guò)外連接
批量抓取(Batch fetching)
批量抓取是對查詢(xún)抓取的優(yōu)化 它會(huì )依據主鍵或者外鍵的列表來(lái)通過(guò)單條SELECT語(yǔ)句實(shí)現管理對象的批量抓取
以上介紹的是Hibernate 所提供的抓取策略 也就是抓取關(guān)聯(lián)對象的手段 為了提升系統的性能 在抓取關(guān)聯(lián)對象的時(shí)機上 還有以下一些選擇
立即抓取(Immediate fetching)
立即抓取是指宿主對象被加載時(shí) 它所關(guān)聯(lián)的對象也會(huì )被立即加載
延遲集合抓取(Lazy collection fetching)
延遲集合抓取是指在加載宿主對象時(shí) 并不立即加載它所關(guān)聯(lián)的對象 而是到應用程序訪(fǎng)問(wèn)關(guān)聯(lián)對象的時(shí)候才抓取關(guān)聯(lián)對象 這是集合關(guān)聯(lián)對象的默認行為
延遲代理抓取(Lazy proxy fetching)
延遲代理抓取是指在返回單值關(guān)聯(lián)對象的情況下 并不在對其進(jìn)行g(shù)et操作時(shí)抓取 而是直到調用其某個(gè)方法的時(shí)候才會(huì )抓取這個(gè)對象
延遲屬性加載(Lazy attribute fetching)
延遲屬性加載是指在關(guān)聯(lián)對象被訪(fǎng)問(wèn)的時(shí)候才進(jìn)行關(guān)聯(lián)對象的抓取
介紹了Hibernate所提供的關(guān)聯(lián)對象的抓取方法和抓取時(shí)機 這兩個(gè)方面的因素都會(huì )影響Hibernate的抓取行為 最重要的是要清楚這兩方面的影響是不同的 不要將這兩個(gè)因素混淆 在開(kāi)發(fā)中要結合實(shí)際情況選用正確的抓取策略和合適的抓取時(shí)機
抓取時(shí)機的選擇
在Hibernate 中 對于集合類(lèi)型的關(guān)聯(lián)在默認情況下會(huì )使用延遲集合加載的抓取時(shí)機 而對于返回單值類(lèi)型的關(guān)聯(lián)在默認情況下會(huì )使用延遲代理抓取的抓取時(shí)機
對于立即抓取在開(kāi)發(fā)中很少被用到 因為這很可能會(huì )造成不必要的數據庫操作 從而影響系統的性能 當宿主對象和關(guān)聯(lián)對象總是被同時(shí)訪(fǎng)問(wèn)的時(shí)候才有可能會(huì )用到這種抓取時(shí)機 另外 使用立即連接抓取可以通過(guò)外連接來(lái)減少查詢(xún)SQL語(yǔ)句的數量 所以 也會(huì )在某些特殊的情況下使用
然而 延遲加載又會(huì )面臨另外一個(gè)問(wèn)題 如果在Session關(guān)閉前關(guān)聯(lián)對象沒(méi)有被實(shí)例化 那么在訪(fǎng)問(wèn)關(guān)聯(lián)對象的時(shí)候就會(huì )拋出異常 處理的方法就是在事務(wù)提交之前就完成對關(guān)聯(lián)對象的訪(fǎng)問(wèn)
所以 在通常情況下都會(huì )使用延遲的方式來(lái)抓取關(guān)聯(lián)的對象 因為每個(gè)立即抓取都會(huì )導致關(guān)聯(lián)對象的立即實(shí)例化 太多的立即抓取關(guān)聯(lián)會(huì )導致大量的對象被實(shí)例化 從而占用過(guò)多的內存資源
抓取策略的選取
對于抓取策略的選取將影響到抓取關(guān)聯(lián)對象的方式 也就是抓取關(guān)聯(lián)對象時(shí)所執行的SQL語(yǔ)句 這就要根據實(shí)際的業(yè)務(wù)需求 數據的數量以及數據庫的結構來(lái)進(jìn)行選擇了
在這里需要注意的是 通常情況下都會(huì )在執行查詢(xún)的時(shí)候針對每個(gè)查詢(xún)來(lái)指定對其合適的抓取策略 指定抓取策略的方法如下所示
User user = (User) session createCriteria(User class)
setFetchMode( permissions FetchMode JOIN)
add( Restrictions idEq(userId) )
uniqueResult();
五 查詢(xún)性能提升小結
在本小節中介紹了查詢(xún)性能提升的方法 關(guān)鍵是如何通過(guò)優(yōu)化SQL語(yǔ)句來(lái)提升系統的查詢(xún)性能 查詢(xún)方法和抓取策略的影響也是通過(guò)執行查詢(xún)方式和SQL語(yǔ)句的多少來(lái)改變系統的性能的 這些都屬于開(kāi)發(fā)人員所應該掌握的基本技能 避免由于開(kāi)發(fā)不當而導致系統性能的低下
在性能調整中 除了前面介紹的執行SQL語(yǔ)句的因素外 對于緩存的使用也會(huì )影響系統的性能 通常來(lái)說(shuō) 緩存的使用會(huì )增加系統查詢(xún)的性能 而降低系統增加 修改和刪除操作的性能(因為要進(jìn)行緩存的同步處理) 所以 開(kāi)發(fā)人員應該能夠正確地使用有效的緩存來(lái)提高數據查詢(xún)的性能 而要避免濫用緩存而導致的系統性能變低 在采用緩存的時(shí)候也應該注意調整自己的檢索策略和查詢(xún)方法 這三者配合起來(lái)才可以達到最優(yōu)的性能
lishixinzhi/Article/program/Java/ky/201311/28720版權聲明: 本站僅提供信息存儲空間服務(wù),旨在傳遞更多信息,不擁有所有權,不承擔相關(guān)法律責任,不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責。如因作品內容、版權和其它問(wèn)題需要同本網(wǎng)聯(lián)系的,請發(fā)送郵件至 舉報,一經(jīng)查實(shí),本站將立刻刪除。