檢索策略和檢索方式_第1頁(yè)
檢索策略和檢索方式_第2頁(yè)
檢索策略和檢索方式_第3頁(yè)
檢索策略和檢索方式_第4頁(yè)
檢索策略和檢索方式_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

檢索策略和檢索方式第1頁(yè),共50頁(yè),2023年,2月20日,星期一Hibernate檢索策略第2頁(yè),共50頁(yè),2023年,2月20日,星期一概述當(dāng)Hibernate從數(shù)據(jù)庫(kù)中加載Customer對(duì)象時(shí),如果同時(shí)加載所有關(guān)聯(lián)的Order對(duì)象,而程序?qū)嶋H上僅僅需要訪問Customer對(duì)象,那么這些關(guān)聯(lián)的Order對(duì)象就白白浪費(fèi)了許多內(nèi)存.域?qū)ο箨P(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù)第3頁(yè),共50頁(yè),2023年,2月20日,星期一類級(jí)別的檢索策略類級(jí)別可選的檢索策略包括立即檢索和延遲檢索,默認(rèn)為延遲檢索立即檢索:立即加載檢索方法指定的對(duì)象延遲檢索:延遲加載檢索方法指定的對(duì)象類級(jí)別的檢索策略可以通過<class>元素的lazy屬性進(jìn)行設(shè)置如果程序加載一個(gè)對(duì)象的目的是為了訪問它的屬性,可以采取立即檢索.如果程序加載一個(gè)持久化對(duì)象的目的是僅僅為了獲得它的引用,可以采用延遲檢索第4頁(yè),共50頁(yè),2023年,2月20日,星期一類級(jí)別的檢索策略無(wú)論<class>元素的lazy屬性是true還是false,Session的get()方法及Query的list()方法在類級(jí)別總是使用立即檢索策略若<class>元素的lazy屬性為true或取默認(rèn)值,Session的load()方法不會(huì)執(zhí)行查詢數(shù)據(jù)表的SELECT語(yǔ)句,僅返回代理類對(duì)象的實(shí)例,該代理類實(shí)例有如下特征:由Hibernate在運(yùn)行時(shí)采用CGLIB工具動(dòng)態(tài)生成Hibernate創(chuàng)建代理類實(shí)例時(shí),僅初始化其OID屬性在應(yīng)用程序第一次訪問代理類實(shí)例的非OID屬性時(shí),Hibernate會(huì)初始化代理類實(shí)例第5頁(yè),共50頁(yè),2023年,2月20日,星期一一對(duì)多和多對(duì)多的檢索策略在映射文件中,用<set>元素來配置一對(duì)多關(guān)聯(lián)及多對(duì)多關(guān)聯(lián)關(guān)系.<set>元素有l(wèi)azy和fetch屬性lazy:主要決定orders集合被初始化的時(shí)機(jī).即到底是在加載Customer對(duì)象時(shí)就被初始化,還是在程序訪問orders集合時(shí)被初始化fetch:取值為“select”或“subselect”時(shí),決定初始化orders的查詢語(yǔ)句的形式;若取值為”join”,則決定orders集合被初始化的時(shí)機(jī)若把fetch設(shè)置為“join”,lazy屬性將被忽略第6頁(yè),共50頁(yè),2023年,2月20日,星期一<set>元素的lazy和fetch屬性第7頁(yè),共50頁(yè),2023年,2月20日,星期一延遲檢索和增強(qiáng)延遲檢索在延遲檢索(lazy屬性值為true)集合屬性時(shí),Hibernate在以下情況下初始化集合代理類實(shí)例應(yīng)用程序第一次訪問集合屬性:iterator(),size(),isEmpty(),contains()等方法通過Hibernate.initialize()靜態(tài)方法顯式初始化增強(qiáng)延遲檢索(lazy屬性為extra):與lazy=“true”類似.主要區(qū)別是增強(qiáng)延遲檢索策略能進(jìn)一步延遲Customer對(duì)象的orders集合代理實(shí)例的初始化時(shí)機(jī):當(dāng)程序第一次訪問orders屬性的iterator()方法時(shí),會(huì)導(dǎo)致orders集合代理類實(shí)例的初始化當(dāng)程序第一次訪問order屬性的size(),contains()和isEmpty()方法時(shí),Hibernate不會(huì)初始化orders集合類的實(shí)例,僅通過特定的select語(yǔ)句查詢必要的信息,不會(huì)檢索所有的Order對(duì)象第8頁(yè),共50頁(yè),2023年,2月20日,星期一<set>元素的batch-size屬性<set>元素有一個(gè)batch-size屬性,用來為延遲檢索策略或立即檢索策略設(shè)定批量檢索的數(shù)量.批量檢索能減少SELECT語(yǔ)句的數(shù)目,提高延遲檢索或立即檢索的運(yùn)行性能.第9頁(yè),共50頁(yè),2023年,2月20日,星期一用帶子查詢的select語(yǔ)句整批量初始化orders集合(fetch屬性為“subselect”)<set>元素的fetch屬性:取值為“select”或“subselect”時(shí),決定初始化orders的查詢語(yǔ)句的形式;若取值為”join”,則決定orders集合被初始化的時(shí)機(jī).默認(rèn)值為select當(dāng)fetch屬性為“subselect”時(shí)假定Session緩存中有n個(gè)orders集合代理類實(shí)例沒有被初始化,Hibernate能夠通過帶子查詢的select語(yǔ)句,來批量初始化n個(gè)orders集合代理類實(shí)例batch-size屬性將被忽略子查詢中的select語(yǔ)句為最初查詢CUSTOMERS表的SELECT語(yǔ)句第10頁(yè),共50頁(yè),2023年,2月20日,星期一迫切左外連接檢索(fetch屬性值設(shè)為“join”)<set>元素的fetch屬性:取值為“select”或“subselect”時(shí),決定初始化orders的查詢語(yǔ)句的形式;若取值為”join”,則決定orders集合被初始化的時(shí)機(jī).默認(rèn)值為select當(dāng)fetch屬性為“join”時(shí):檢索Customer對(duì)象時(shí),會(huì)采用迫切左外連接(通過做外連接加載與檢索指定的對(duì)象關(guān)聯(lián)的對(duì)象)策略來檢索所有關(guān)聯(lián)的Order對(duì)象lazy屬性將被忽略Query的list()方法會(huì)忽略映射文件中配置的迫切左外連接檢索策略,而依舊采用延遲加載策略第11頁(yè),共50頁(yè),2023年,2月20日,星期一多對(duì)一和一對(duì)一關(guān)聯(lián)的檢索策略和<set>一樣,<many-to-one>元素也有一個(gè)lazy屬性和fetch屬性.若fetch屬性設(shè)為join,那么lazy屬性被忽略迫切左外連接檢索策略的優(yōu)點(diǎn)在于比立即檢索策略使用的SELECT語(yǔ)句更少.無(wú)代理延遲檢索需要增強(qiáng)持久化類的字節(jié)碼才能實(shí)現(xiàn)第12頁(yè),共50頁(yè),2023年,2月20日,星期一多對(duì)一和一對(duì)一關(guān)聯(lián)的檢索策略Query的list方法會(huì)忽略映射文件配置的迫切左外連接檢索策略,而采用延遲檢索策略如果在關(guān)聯(lián)級(jí)別使用了延遲加載或立即加載檢索策略,可以設(shè)定批量檢索的大小,以幫助提高延遲檢索或立即檢索的運(yùn)行性能.Hibernate允許在應(yīng)用程序中覆蓋映射文件中設(shè)定的檢索策略.第13頁(yè),共50頁(yè),2023年,2月20日,星期一檢索策略小結(jié)類級(jí)別和關(guān)聯(lián)級(jí)別可選的檢索策略及默認(rèn)的檢索策略3種檢索策略的運(yùn)行機(jī)制第14頁(yè),共50頁(yè),2023年,2月20日,星期一檢索策略小結(jié)映射文件中用于設(shè)定檢索策略的幾個(gè)屬性第15頁(yè),共50頁(yè),2023年,2月20日,星期一檢索策略小結(jié)比較Hibernate的三種檢索策略第16頁(yè),共50頁(yè),2023年,2月20日,星期一Hibernate檢索方式第17頁(yè),共50頁(yè),2023年,2月20日,星期一概述Hibernate提供了以下幾種檢索對(duì)象的方式導(dǎo)航對(duì)象圖檢索方式:根據(jù)已經(jīng)加載的對(duì)象導(dǎo)航到其他對(duì)象OID檢索方式:按照對(duì)象的OID來檢索對(duì)象HQL檢索方式:使用面向?qū)ο蟮腍QL查詢語(yǔ)言QBC檢索方式:使用QBC(QueryByCriteria)API來檢索對(duì)象.這種API封裝了基于字符串形式的查詢語(yǔ)句,提供了更加面向?qū)ο蟮牟樵兘涌?本地SQL檢索方式:使用本地?cái)?shù)據(jù)庫(kù)的SQL查詢語(yǔ)句第18頁(yè),共50頁(yè),2023年,2月20日,星期一HQL檢索方式HQL(HibernateQueryLanguage)是面向?qū)ο蟮牟樵冋Z(yǔ)言,它和SQL查詢語(yǔ)言有些相似.在Hibernate提供的各種檢索方式中,HQL是使用最廣的一種檢索方式.它有如下功能:在查詢語(yǔ)句中設(shè)定各種查詢條件支持投影查詢,即僅檢索出對(duì)象的部分屬性支持分頁(yè)查詢支持連接查詢支持分組查詢,允許使用HAVING和GROUPBY關(guān)鍵字提供內(nèi)置聚集函數(shù),如sum(),min()和max()能夠調(diào)用用戶定義的SQL函數(shù)或標(biāo)準(zhǔn)的SQL函數(shù)支持子查詢支持動(dòng)態(tài)綁定參數(shù)第19頁(yè),共50頁(yè),2023年,2月20日,星期一HQL檢索方式HQL檢索方式包括以下步驟:通過Session的createQuery()方法創(chuàng)建一個(gè)Query對(duì)象,它包括一個(gè)HQL查詢語(yǔ)句.HQL查詢語(yǔ)句中可以包含命名參數(shù)動(dòng)態(tài)綁定參數(shù)調(diào)用Query的list()方法執(zhí)行查詢語(yǔ)句.該方法返回java.util.List類型的查詢結(jié)果,在List集合中存放了符合查詢條件的持久化對(duì)象.Qurey接口支持方法鏈編程風(fēng)格,它的setXxx()方法返回自身實(shí)例,而不是void類型HQLvsSQL:HQL查詢語(yǔ)句是面向?qū)ο蟮?Hibernate負(fù)責(zé)解析HQL查詢語(yǔ)句,然后根據(jù)對(duì)象-關(guān)系映射文件中的映射信息,把HQL查詢語(yǔ)句翻譯成相應(yīng)的SQL語(yǔ)句.HQL查詢語(yǔ)句中的主體是域模型中的類及類的屬性SQL查詢語(yǔ)句是與關(guān)系數(shù)據(jù)庫(kù)綁定在一起的.SQL查詢語(yǔ)句中的主體是數(shù)據(jù)庫(kù)表及表的字段.第20頁(yè),共50頁(yè),2023年,2月20日,星期一HQL檢索方式綁定參數(shù):Hibernate的參數(shù)綁定機(jī)制依賴于JDBCAPI中的PreparedStatement的預(yù)定義SQL語(yǔ)句功能.HQL的參數(shù)綁定由兩種形式:按參數(shù)名字綁定:在HQL查詢語(yǔ)句中定義命名參數(shù),命名參數(shù)以“:”開頭.按參數(shù)位置綁定:在HQL查詢語(yǔ)句中用“?”來定義參數(shù)位置相關(guān)方法:setEntity():把參數(shù)與一個(gè)持久化類綁定setParameter():綁定任意類型的參數(shù).該方法的第三個(gè)參數(shù)顯式指定Hibernate映射類型HQL采用ORDERBY關(guān)鍵字對(duì)查詢結(jié)果排序第21頁(yè),共50頁(yè),2023年,2月20日,星期一HQL檢索方式分頁(yè)查詢:setFirstResult(intfirstResult):設(shè)定從哪一個(gè)對(duì)象開始檢索,參數(shù)firstResult表示這個(gè)對(duì)象在查詢結(jié)果中的索引位置,索引位置的起始值為0.默認(rèn)情況下,Query從查詢結(jié)果中的第一個(gè)對(duì)象開始檢索setMaxResults(intmaxResults):設(shè)定一次最多檢索出的對(duì)象的數(shù)目.在默認(rèn)情況下,Query和Criteria接口檢索出查詢結(jié)果中所有的對(duì)象第22頁(yè),共50頁(yè),2023年,2月20日,星期一HQL檢索方式可滾動(dòng)的結(jié)果集:Query接口的scroll()方法返回一個(gè)org.hibernate.ScrollableResults對(duì)象,它就代表可滾動(dòng)的結(jié)果集在訪問ScrollableResults結(jié)果集結(jié)束后,應(yīng)該即時(shí)調(diào)用ScrollableResults的close()關(guān)閉結(jié)果集,從而關(guān)閉數(shù)據(jù)庫(kù)中于此結(jié)果對(duì)應(yīng)的游標(biāo)在映射文件中定義命名查詢語(yǔ)句Hibernate允許在映射文件中定義字符串形式的查詢語(yǔ)句.<query>元素用于定義一個(gè)HQL查詢語(yǔ)句,它和<class>元素并列.在程序中通過Session的getNameQuery()方法獲取查詢語(yǔ)句對(duì)應(yīng)的Query對(duì)象.第23頁(yè),共50頁(yè),2023年,2月20日,星期一HQL(迫切)左外連接迫切左外連接:LEFTJOIN

FETCH關(guān)鍵字表示迫切左外連接檢索策略.list()方法返回的集合中存放Customer對(duì)象的引用,每個(gè)Customer對(duì)象的orders集合都被初始化,存放所有關(guān)聯(lián)的Order對(duì)象.查詢結(jié)果中可能會(huì)包含重復(fù)元素,可以通過一個(gè)HashSet來過濾重復(fù)元素左外連接:LEFTJOIN關(guān)鍵字表示左外連接查詢.將根據(jù)配置文件來決定orders集合的檢索策略.即使在映射文件中設(shè)置了延遲檢索策略,在運(yùn)行l(wèi)ist()方法時(shí),Hibernate執(zhí)行的SQL語(yǔ)句依然與迫切左外連接生成的查詢語(yǔ)句相同list()方法返回的集合中存放的是對(duì)象數(shù)組類型如果希望list()方法返回的集合中僅包含Customer對(duì)象,可以在HQL查詢語(yǔ)句中使用SELECT關(guān)鍵字第24頁(yè),共50頁(yè),2023年,2月20日,星期一HQL迫切左外連接迫切左外連接Query的list()方法返回結(jié)果resultCustomer類型引用Customer類型引用Customer類型引用Customer類型引用Customer對(duì)象(OID=1)Customer對(duì)象(OID=2)Oders集合(被初始化)Oder對(duì)象(OID=1)Oder對(duì)象(OID=2)Oder對(duì)象(OID=3)第25頁(yè),共50頁(yè),2023年,2月20日,星期一HQL左外連接左外連接Query的list()方法返回結(jié)果resultObject[]Customer對(duì)象(OID=1)Customer對(duì)象(OID=2)Oders集合(沒有被初始化)Oder對(duì)象(OID=1)Oder對(duì)象(OID=2)Oder對(duì)象(OID=3)Object[]Object[]Object[]null第26頁(yè),共50頁(yè),2023年,2月20日,星期一HQL內(nèi)連接內(nèi)連接:INNERJOIN關(guān)鍵字表示內(nèi)連接,也可以省略INNER關(guān)鍵字list()方法的集合中存放的每個(gè)元素對(duì)應(yīng)查詢結(jié)果的一條記錄,每個(gè)元素都是對(duì)象數(shù)組類型如果希望list()方法的返回的集合僅包含Customer對(duì)象,可以在HQL查詢語(yǔ)句中使用SELECT關(guān)鍵字resultObject[]Customer對(duì)象(OID=1)Oders集合(沒有被初始化)Oder對(duì)象(OID=1)Oder對(duì)象(OID=2)Oder對(duì)象(OID=3)Object[]Object[]第27頁(yè),共50頁(yè),2023年,2月20日,星期一HQL迫切內(nèi)連接迫切內(nèi)連接:INNERJOINFETCH關(guān)鍵字表示迫切內(nèi)連接,也可以省略INNER關(guān)鍵字list()方法返回的集合中存放Customer對(duì)象的引用,每個(gè)Customer對(duì)象的orders集合都被初始化,存放所有關(guān)聯(lián)的Order對(duì)象resultCustomer類型引用Customer類型引用Customer類型引用Customer對(duì)象(OID=1)Oders集合(被初始化)Oder對(duì)象(OID=1)Oder對(duì)象(OID=2)Oder對(duì)象(OID=3)第28頁(yè),共50頁(yè),2023年,2月20日,星期一關(guān)聯(lián)級(jí)別運(yùn)行時(shí)的檢索策略如果在HQL中沒有顯式指定檢索策略,將使用映射文件配置的檢索策略.HQL會(huì)忽略映射文件中設(shè)置的迫切左外連接檢索策略,如果希望HQL采用迫切左外連接策略,就必須在HQL查詢語(yǔ)句中顯式的指定它若在HQL代碼中顯式指定了檢索策略,就會(huì)覆蓋映射文件中配置的檢索策略第29頁(yè),共50頁(yè),2023年,2月20日,星期一投影查詢投影查詢:查詢結(jié)果僅包含實(shí)體的部分屬性.通過SELECT關(guān)鍵字實(shí)現(xiàn).Query的list()方法返回的集合中包含的是數(shù)組類型的元素,每個(gè)對(duì)象數(shù)組代表查詢結(jié)果的一條記錄可以在持久化類中定義一個(gè)對(duì)象的構(gòu)造器來包裝投影查詢返回的記錄,使程序代碼能完全運(yùn)用面向?qū)ο蟮恼Z(yǔ)義來訪問查詢結(jié)果集.可以通過DISTINCT關(guān)鍵字來保證查詢結(jié)果不會(huì)返回重復(fù)元素第30頁(yè),共50頁(yè),2023年,2月20日,星期一報(bào)表查詢報(bào)表查詢用于對(duì)數(shù)據(jù)分組和統(tǒng)計(jì),與SQL一樣,HQL利用GROUPBY關(guān)鍵字對(duì)數(shù)據(jù)分組,用HAVING關(guān)鍵字對(duì)分組數(shù)據(jù)設(shè)定約束條件.在HQL查詢語(yǔ)句中可以調(diào)用以下聚集函數(shù)count()min()max()sum()avg()第31頁(yè),共50頁(yè),2023年,2月20日,星期一Hibernate二級(jí)緩存第32頁(yè),共50頁(yè),2023年,2月20日,星期一Hibernate緩存緩存(Cache):計(jì)算機(jī)領(lǐng)域非常通用的概念。它介于應(yīng)用程序和永久性數(shù)據(jù)存儲(chǔ)源(如硬盤上的文件或者數(shù)據(jù)庫(kù))之間,其作用是降低應(yīng)用程序直接讀寫永久性數(shù)據(jù)存儲(chǔ)源的頻率,從而提高應(yīng)用的運(yùn)行性能。緩存中的數(shù)據(jù)是數(shù)據(jù)存儲(chǔ)源中數(shù)據(jù)的拷貝。緩存的物理介質(zhì)通常是內(nèi)存Hibernate中提供了兩個(gè)級(jí)別的緩存第一級(jí)別的緩存是Session級(jí)別的緩存,它是屬于事務(wù)范圍的緩存。這一級(jí)別的緩存由hibernate管理的,一般情況下無(wú)需進(jìn)行干預(yù)第二級(jí)別的緩存是SessionFactory級(jí)別的緩存,它是屬于進(jìn)程范圍的緩存第33頁(yè),共50頁(yè),2023年,2月20日,星期一Hibernate的二級(jí)緩存SessionFactory的緩存可以分為兩類:內(nèi)置緩存:Hibernate自帶的,不可卸載.通常在Hibernate的初始化階段,Hibernate會(huì)把映射元數(shù)據(jù)和預(yù)定義的SQL語(yǔ)句放到SessionFactory的緩存中,映射元數(shù)據(jù)是映射文件中數(shù)據(jù)的復(fù)制,而預(yù)定義SQL語(yǔ)句時(shí)Hibernate根據(jù)映射元數(shù)據(jù)推到出來的.該內(nèi)置緩存是只讀的.外置緩存(二級(jí)緩存):一個(gè)可配置的緩存插件.在默認(rèn)情況下,SessionFactory不會(huì)啟用這個(gè)緩存插件.外置緩存中的數(shù)據(jù)是數(shù)據(jù)庫(kù)數(shù)據(jù)的復(fù)制,外置緩存的物理介質(zhì)可以是內(nèi)存或硬盤第34頁(yè),共50頁(yè),2023年,2月20日,星期一二級(jí)緩存的并發(fā)訪問策略兩個(gè)并發(fā)的事務(wù)同時(shí)訪問持久層的緩存的相同數(shù)據(jù)時(shí),也有可能出現(xiàn)各類并發(fā)問題.二級(jí)緩存可以設(shè)定以下4種類型的并發(fā)訪問策略,每一種訪問策略對(duì)應(yīng)一種事務(wù)隔離級(jí)別非嚴(yán)格讀寫(Nonstrict-read-write):不保證緩存與數(shù)據(jù)庫(kù)中數(shù)據(jù)的一致性.提供ReadUncommited事務(wù)隔離級(jí)別,對(duì)于極少被修改,而且允許臟讀的數(shù)據(jù),可以采用這種策略讀寫型(Read-write):提供ReadCommited數(shù)據(jù)隔離級(jí)別.對(duì)于經(jīng)常讀但是很少被修改的數(shù)據(jù),可以采用這種隔離類型,因?yàn)樗梢苑乐古K讀事務(wù)型(Transactional):僅在受管理環(huán)境下適用.它提供了RepeatableRead事務(wù)隔離級(jí)別.對(duì)于經(jīng)常讀但是很少被修改的數(shù)據(jù),可以采用這種隔離類型,因?yàn)樗梢苑乐古K讀和不可重復(fù)讀只讀型(Read-Only):提供Serializable數(shù)據(jù)隔離級(jí)別,對(duì)于從來不會(huì)被修改的數(shù)據(jù),可以采用這種訪問策略第35頁(yè),共50頁(yè),2023年,2月20日,星期一使用Hibernate的二級(jí)緩存適合放入二級(jí)緩存中的數(shù)據(jù):很少被修改不是很重要的數(shù)據(jù),允許出現(xiàn)偶爾的并發(fā)問題不適合放入二級(jí)緩存中的數(shù)據(jù):經(jīng)常被修改財(cái)務(wù)數(shù)據(jù),絕對(duì)不允許出現(xiàn)并發(fā)問題與其他應(yīng)用數(shù)據(jù)共享的數(shù)據(jù)第36頁(yè),共50頁(yè),2023年,2月20日,星期一Hibernate二級(jí)緩存的結(jié)構(gòu)緩存并發(fā)訪問策略查詢緩存緩存適配器(CacheProvider)緩存的實(shí)現(xiàn)Hibernate的二級(jí)緩存第37頁(yè),共50頁(yè),2023年,2月20日,星期一管理Hibernate的二級(jí)緩存Hibernate的二級(jí)緩存是進(jìn)程或集群范圍內(nèi)的緩存,緩存中存放的是對(duì)象的散裝數(shù)據(jù)二級(jí)緩存是可配置的的插件,Hibernate允許選用以下類型的緩存插件:EHCache:可作為進(jìn)程范圍內(nèi)的緩存,存放數(shù)據(jù)的物理介質(zhì)可以使內(nèi)存或硬盤,對(duì)Hibernate的查詢緩存提供了支持OpenSymphonyOSCache:可作為進(jìn)程范圍內(nèi)的緩存,存放數(shù)據(jù)的物理介質(zhì)可以使內(nèi)存或硬盤,提供了豐富的緩存數(shù)據(jù)過期策略,對(duì)Hibernate的查詢緩存提供了支持SwarmCache:可作為集群范圍內(nèi)的緩存,但不支持Hibernate的查詢緩存JBossCache:可作為集群范圍內(nèi)的緩存,支持Hibernate的查詢緩存4種緩存插件支持的并發(fā)訪問策略(x代表支持,空白代表不支持)第38頁(yè),共50頁(yè),2023年,2月20日,星期一配置進(jìn)程范圍內(nèi)的二級(jí)緩存配置進(jìn)程范圍內(nèi)的二級(jí)緩存的步驟:選擇合適的緩存插件:EHCache(jar包和配置文件),并編譯器配置文件在Hibernate的配置文件中指定和EHCache對(duì)應(yīng)的緩存適配器選擇需要使用二級(jí)緩存的持久化類,設(shè)置它的二級(jí)緩存的并發(fā)訪問策略,<class>元素的cache子元素表明Hibernate會(huì)緩存對(duì)象的簡(jiǎn)單屬性,但不會(huì)緩存集合屬性,若希望緩存集合屬性中的元素,必須在<set>元素中加入<cache>子元素第39頁(yè),共50頁(yè),2023年,2月20日,星期一ehcache.xml<diskStore>:指定一個(gè)目錄,當(dāng)EHCache把數(shù)據(jù)寫到硬盤上時(shí),將把數(shù)據(jù)寫到這個(gè)文件目錄下.<defaultCache>:設(shè)置緩存的默認(rèn)數(shù)據(jù)過期策略<cache>設(shè)定具體的命名緩存的數(shù)據(jù)過期策略每個(gè)命名緩存代表一個(gè)緩存區(qū)域,每個(gè)緩存區(qū)域有各自的數(shù)據(jù)過期策略。命名緩存機(jī)制使得用戶能夠在每個(gè)類以及類的每個(gè)集合的粒度上設(shè)置數(shù)據(jù)過期策略。cache元素的屬性

name:設(shè)置緩存的名字,它的取值為類的全限定名或類的集合的名字maxInMemory:設(shè)置基于內(nèi)存的緩存中可存放的對(duì)象最大數(shù)目eternal:設(shè)置對(duì)象是否為永久的,true表示永不過期,此時(shí)將忽略timeToIdleSeconds和timeToLiveSeconds屬性;默認(rèn)值是falsetimeToIdleSeconds:設(shè)置對(duì)象空閑最長(zhǎng)時(shí)間,以秒為單位,超過這個(gè)時(shí)間,對(duì)象過期。當(dāng)對(duì)象過期時(shí),EHCache會(huì)把它從緩存中清除。如果此值為0,表示對(duì)象可以無(wú)限期地處于空閑狀態(tài)。timeToLiveSeconds:設(shè)置對(duì)象生存最長(zhǎng)時(shí)間,超過這個(gè)時(shí)間,對(duì)象過期。

如果此值為0,表示對(duì)象可以無(wú)限期地存在于緩存中.該屬性值必須大于或等于timeToIdleSeconds屬性值overflowToDisk:設(shè)置基于內(nèi)在的緩存中的對(duì)象數(shù)目達(dá)到上限后,是否把溢出的對(duì)象寫到基于硬盤的緩存中第40頁(yè),共50頁(yè),2023年,2月20日,星期一查詢緩存對(duì)于經(jīng)常使用的查詢語(yǔ)句,如果啟用了查詢緩存,當(dāng)?shù)谝淮螆?zhí)行查詢語(yǔ)句時(shí),Hibernate會(huì)把查詢結(jié)果存放在查詢緩存中.以后再次執(zhí)行該查詢語(yǔ)句時(shí),只需從緩存中獲得查詢結(jié)果,從而提高查詢性能查詢緩存使用于如下場(chǎng)合:應(yīng)用程序運(yùn)行時(shí)經(jīng)常使用查詢語(yǔ)句很少對(duì)與查詢語(yǔ)句檢索到的數(shù)據(jù)進(jìn)行插入,刪除和更新操作啟用查詢緩存的步驟配置二級(jí)緩存,因?yàn)椴樵兙彺嬉蕾囉诙?jí)緩存在hibernate配置文件中啟用查詢緩存對(duì)于希望啟用查詢緩存的查詢語(yǔ)句,調(diào)用Query的setCacheable()方法第41頁(yè),共50頁(yè),2023年,2月20日,星期一時(shí)間戳緩存區(qū)域Hibernate提供了三種和查詢相關(guān)的緩存區(qū)域:默認(rèn)的查詢緩存區(qū)域:org.hibernate.cache.StandardQueryCache用戶自定義的緩存區(qū)域時(shí)間戳緩存區(qū)域:org.hibernate.cahce.UpdateTimestampCache時(shí)間戳緩存區(qū)域存放了對(duì)于查詢結(jié)果相關(guān)的表進(jìn)行插入,更新或刪除操作的時(shí)間戳.Hibernate通過時(shí)間戳緩存區(qū)域來判斷被緩存的查詢結(jié)果是否過期,其運(yùn)行過程如下:T1時(shí)刻執(zhí)行查詢操作,把查詢結(jié)果存放在QueryCache區(qū)域,記錄該區(qū)域的時(shí)間戳為T1T2時(shí)刻對(duì)查詢結(jié)果相關(guān)的表進(jìn)行更新操作,Hibernate把T2時(shí)刻存放在UpdateTimestampCache區(qū)域.T3時(shí)刻執(zhí)行查詢結(jié)果前,先比較QueryCache區(qū)域的時(shí)間戳和UpdateTimestampCache區(qū)域的時(shí)間戳,若T2>T1,那么就丟棄原先存放在QueryCache區(qū)域的查詢結(jié)果,重新到數(shù)據(jù)庫(kù)中查詢數(shù)據(jù),再把結(jié)果存放到QueryCache區(qū)域;若T2<T1,直接從QueryCache中獲得查詢結(jié)果第42頁(yè),共50頁(yè),2023年,2月20日,星期一Query接口的iterator()方法Query接口的iterator()方法同list()一樣也能執(zhí)行查詢操作list()方法執(zhí)行的SQL語(yǔ)句包含實(shí)體類對(duì)應(yīng)的數(shù)據(jù)表的所有字段Iterator()方法執(zhí)行的SQL語(yǔ)句中僅包含實(shí)體類對(duì)應(yīng)的數(shù)據(jù)表的ID字段當(dāng)遍歷訪問結(jié)果集時(shí),該方法先到Session緩存及二級(jí)緩存中查看是否存在特定OID的對(duì)象,如果存在,就直接返回該對(duì)象,如果不存在該對(duì)象就通過相應(yīng)的SQLSelect語(yǔ)句到數(shù)據(jù)庫(kù)中加載特定的實(shí)體對(duì)象大多數(shù)情況下,應(yīng)考慮使用list()方法執(zhí)行查詢操作.iterator()方法僅在滿足以下條件的場(chǎng)合,可以稍微提高查詢性能:要查詢的數(shù)據(jù)表中包含大量字段啟用了二級(jí)緩存,且二級(jí)緩存中可能已經(jīng)包含了待查詢的對(duì)象第43頁(yè),共50頁(yè),2023年,2月20日,星期一批量處理數(shù)據(jù)批量處理數(shù)據(jù)是指在一個(gè)事務(wù)中處理大量數(shù)據(jù).在應(yīng)用層進(jìn)行批量操作,主要有以下方式:通過Session通過HQL通過StatelessSession通過JDBCAPI第44頁(yè),共50頁(yè),2023年,2月20日,星期一通過Session來進(jìn)行批量操作Session的save()及update()方法都會(huì)把處理的對(duì)象存放在自己的緩存中.如果通過一個(gè)Session對(duì)象來處理大量持久化對(duì)象,應(yīng)該及時(shí)從緩存中清空已經(jīng)處理完畢并且不會(huì)再訪問的對(duì)象.具體的做法是在處理完一個(gè)對(duì)象或小批量對(duì)象后,立即調(diào)用flush()方法清理緩存,然后在調(diào)用clear()方法清空緩存通過Session來進(jìn)行處理操作會(huì)受到以下約束需要在Hibernate配置文件中設(shè)置JDBC單次批量處理的數(shù)目,應(yīng)保證每次向數(shù)據(jù)庫(kù)發(fā)送的批量的SQL語(yǔ)句數(shù)目與batch_size屬性一致若對(duì)象采用“identity”標(biāo)識(shí)符生成器,則Hibernate無(wú)法在JDBC層進(jìn)行批量插入操作進(jìn)行批量操作時(shí),建議關(guān)閉Hibernate的二級(jí)緩存第45頁(yè),共50頁(yè),2023年,2月20日,星期一通過Session來進(jìn)行批量操作批量插入數(shù)據(jù):第46頁(yè),共50頁(yè),2023年,2月20日,星期一通過Session來進(jìn)行批量操作批量更新:在進(jìn)行批量更新時(shí),如果一下子把所有對(duì)象都加載到Session緩存,然后再緩存中一一更新,顯然是不可取的使用可滾動(dòng)的結(jié)果集org.hibernate.ScrollableResults,該對(duì)象中實(shí)際上并不包含任何對(duì)象,只包含用于在線定位記錄的游標(biāo).只有當(dāng)程序遍歷訪問ScrollableResults對(duì)象的特定元素時(shí),它才會(huì)到數(shù)據(jù)庫(kù)中加載相應(yīng)的對(duì)象.org.hibernate.Scro

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論