這篇文章主要介紹了如何解決Hibernate懶加載,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
阿巴嘎ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!所謂懶加載(lazy)就是延時(shí)加載,延遲加載。
什么時(shí)候用懶加載呢,我只能回答要用懶加載的時(shí)候就用懶加載。
至于為什么要用懶加載呢,就是當(dāng)我們要訪問的數(shù)據(jù)量過大時(shí),明顯用緩存不太合適,因?yàn)閮?nèi)存容量有限,為了減少并發(fā)量,減少系統(tǒng)資源的消耗,我們讓數(shù)據(jù)在需要的時(shí)候才進(jìn)行加載,這時(shí)我們就用到了懶加載。
例如,有一個(gè)對(duì)象是Employee,還有一個(gè)對(duì)象是Department。顯然,對(duì)于Employee相對(duì)Department來說,是多對(duì)一的關(guān)系;而對(duì)于Department相對(duì)Employee來說,是一對(duì)多的關(guān)系。當(dāng)我們查詢Employee對(duì)象的時(shí)候,如果希望通過employee對(duì)象的屬性department查詢到所對(duì)應(yīng)的Department,那么是會(huì)拋出異常的。這是因?yàn)閼屑虞d的存在,在session關(guān)閉之后,hibernate又向數(shù)據(jù)庫發(fā)出一次請(qǐng)求,結(jié)果就拋出異常了。
下面總結(jié)的是解決這個(gè)問題的四種方式:
1.顯式初始化(在查詢方法內(nèi)部)
要查詢某員工屬于哪個(gè)部門的時(shí)候,需要對(duì)Department進(jìn)行預(yù)先查詢
使用語句
Hibernate.initialize(Department.class);
2.修改對(duì)象關(guān)系文件,將lazy改寫lazy=false,即關(guān)閉懶加載
以上兩種方法,確實(shí)可以解決問題,但是缺點(diǎn)是無論后面是否使用該對(duì)象,hibernate都會(huì)向數(shù)據(jù)庫發(fā)出SQL語句請(qǐng)求數(shù)據(jù),造成不必要的性能浪費(fèi)。
3.使用過濾器(web項(xiàng)目)
①獲取session的方式必須使用getCurrentSession
②特殊的關(guān)閉session方式
public void doFilter(ServletRequest request, ServletResponse response, FilterChain arg2) throws IOException, ServletException { // TODO Auto-generated method stub Session session = null; Transaction tx = null; try { session = HibernateUtil.getCurrentSession(); tx = session.beginTransaction(); arg2.doFilter(request, response);//請(qǐng)求一直在走 tx.commit(); } catch (Exception e) { // TODO: handle exception if(tx != null){ tx.rollback(); } }finally{ //特殊的關(guān)閉方式 HibernateUtil.closeCurrentSession(); } }
4.在SSH框架中,使用spring提供的openSessionView
其原理和第三種方法中使用Filter類似,只不過這個(gè)filter是spring提供的。使用時(shí)只需要在web.xml文件配置如下:
<!-- 使用spring解決懶加載問題 --> <filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
第3和第4中方法也能解決懶加載的問題,其中第4種方法也是目前使用較多的。但是這兩種方法也是有缺點(diǎn)的,缺點(diǎn)就是延長了session關(guān)閉的時(shí)間,session的生命周期變長。沒有使用該方法之前,session是在查詢完數(shù)據(jù)之后,就被關(guān)閉了;而現(xiàn)在,session的關(guān)閉是在一次web請(qǐng)求的最后才關(guān)閉。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“如何解決Hibernate懶加載”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!
新聞標(biāo)題:如何解決Hibernate懶加載-創(chuàng)新互聯(lián)
URL標(biāo)題:http://aaarwkj.com/article38/cchgsp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、外貿(mào)建站、自適應(yīng)網(wǎng)站、網(wǎng)站排名、網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容