本篇內(nèi)容介紹了“Hibernate一級緩存是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)公司一直在為企業(yè)提供服務(wù),多年的磨煉,使我們在創(chuàng)意設(shè)計,營銷型網(wǎng)站到技術(shù)研發(fā)擁有了開發(fā)經(jīng)驗。我們擅長傾聽企業(yè)需求,挖掘用戶對產(chǎn)品需求服務(wù)價值,為企業(yè)制作有用的創(chuàng)意設(shè)計體驗。核心團隊擁有超過十載以上行業(yè)經(jīng)驗,涵蓋創(chuàng)意,策化,開發(fā)等專業(yè)領(lǐng)域,公司涉及領(lǐng)域有基礎(chǔ)互聯(lián)網(wǎng)服務(wù)德陽機房托管、手機APP定制開發(fā)、手機移動建站、網(wǎng)頁設(shè)計、網(wǎng)絡(luò)整合營銷。
在學習Hibernate中,我們都知道由于一級Hibernate緩存的生命周期跟Session的生命周期一樣,所以也可以理解為一級Hibernate緩存是session緩存。
一、通過在做查詢的時候,有幾個查詢方法支持一級Hibernate緩存,它們分別是:load(),get(),iterate(),其中要注意的是iterate方法只對實體對象查詢才支持一級緩存,如果使用iterate來查詢對象里面的相關(guān)屬性,則查詢的時候不支持一級緩存。
1、load()方法。
例子:
Student s = (Student)session.load(Student.class, 1); System.out.println(s.getName()); System.out.println("---------------------"); s = (Student)session.load(Student.class, 1); System.out.println(s.getName());
只發(fā)出一條sql語句,雖然這里使用兩次load方法,但是***次load方法對于id為1的記錄進行加載,到第3行才發(fā)出一條sql語句及符合的數(shù)據(jù),這樣就把數(shù)據(jù)放在一級緩存里面,在第4行開始繼續(xù)使用load就從一級緩存里面抽取。
2、get()方法。
例子:
Student s = (Student)session.get(Student.class, 1); System.out.println(s.getName()); System.out.println("---------------------"); s = (Student)session.load(Student.class, 1); System.out.println(s.getName());
跟1中l(wèi)oad一樣,只發(fā)出一條sql語句。
3、iterate()方法查詢實體對象
例子:
Student student = (Student)session.createQuery("from Student s where s.id=1").iterate().next(); System.out.println("student.name=" + student.getName()); //會發(fā)出查詢id的sql,不會發(fā)出查詢實體對象的sql,因為iterate使用緩存 student = (Student)session.createQuery("from Student s where s.id=1").iterate().next(); System.out.println("student.name=" + student.getName());
總共發(fā)出3條sql語句,1、2行發(fā)出兩條語句,1條是查詢實體對象的sql,另一條是查詢實體對象的name屬性,由于使用一級緩存,之前1、2行查詢的實體存放在一級緩存里面,所以5、6行利用一級緩存里面的數(shù)據(jù)只發(fā)出一條查詢id的sql。
4、iterate()方法查詢實體對象屬性(不支持一級緩存)
例子:
String name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next(); System.out.println("student.name=" + name); //iterate查詢普通屬性,一級緩存不會緩存,所以發(fā)出sql //一級緩存是緩存實體對象的 name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next(); System.out.println("student.name=" + name);
由于iterate()方法查詢實體對象屬性,一級緩存不會產(chǎn)生作用,所以發(fā)出兩條sql語句。
二、一級緩存是存在的,所以要更加合理的管理好,提高程序的效率,通常都是通過clear(),evict()方法來清除緩存,當不需要使用一級緩存或者是更加高效率使用一級緩存。
如果在一次性更新或者加入數(shù)量量比較大的情況下,更加要管理好一級緩存。
例子:
for(int i=0;i<10000;i++) { Student s = new Student(); s.setName("s"+i); session.save(s); if(i%20==0) { session.flush(); session.clear(); } }
在數(shù)據(jù)量比較大的情況下管理一級緩存的做法,一般都是設(shè)定一定數(shù)量的記錄給更新或者保存等操作之后,避免一次性大量的實體數(shù)據(jù)入庫導致內(nèi)存溢出,所以才去先是用第8行的flush和第9行的clear方法來實現(xiàn)比較好的緩存管理。
在數(shù)據(jù)量特別大的時候,可以使用jdbc來實現(xiàn),因為hibernate不太適合于數(shù)據(jù)量特別大的場合使用,如果連jdbc都滿足不了數(shù)據(jù)量的效率要求,只好利用相關(guān)的數(shù)據(jù)庫機制來實現(xiàn)。
“Hibernate一級緩存是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!