1. 程式人生 > >Hibernate查詢快取全面分析

Hibernate查詢快取全面分析

這裡介紹Hibernate查詢快取對Iterator不起作用,只對List起作用。

快取分類:
◆一級快取 Session級
◆二級快取 SessionFactory級別,JVM級別
◆Hibernate查詢快取不固定(生命週期不固定)

生命週期:
◆一級快取 是和 session 會話一致產生一致消失
◆二級快取 是和 sessionFacotry 一致
◆Hibernate查詢快取 生命週期不固定,當資料庫表發生改變,使用Hibernate查詢快取馬上消失

使用方法:
◆一級快取:這個就不用說了
◆二級快取:首先拷貝使用Hibernate查詢快取類別.xml到 classpath目錄下面,然後到hibernate.cfg.xml裡面配置。開啟二級快取(預設開啟),定義要使用二級快取的實體類,然後就是在程式中要顯示的指定session。使用二級快取的類別 有三種,Normal,GET,PUT預設使用的是 Normal即可以寫也可以讀取二級快取(這裡讀寫是指的會話Session)
◆Hibernate查詢快取:首先也是到hibernate配置檔案中去開啟Hibernate查詢快取,然後程式中也要顯示的呼叫方法來開啟Hibernate查詢快取eg:query.setCachemodel(true);

快取的儲存物件:
◆一級快取:快取實體
◆二級快取:快取的也是實體
◆Hibernate查詢快取快取的是查詢出來的實體的部分屬性結果集和實體的ID(注意這裡不是實體)

快取的使用物件:
◆一級快取:
Load(Lazy載入):首先查詢把序列號去和一級快取匹配是否有,有就直接取出來,如果沒有,則發出SQL語句。
Get:也使用一級快取。
List介面:query.list()不使用一級快取,每次都要發出SQL eg:(select * from tudent)。
Iterator介面: query.iterate();使用一級快取。首先是要發出一條SQL來取得ID,eg: select。id from student; 然後把ID拿到快取中去匹配, 如果有,就直接取,如果沒有,就要再發出SQL。如果都沒有,將發出N+1條SQL,這就是N+1問題。
◆二級快取: 都使用了二級快取。
◆Hibernate查詢快取:對List 和Iterator介面起作用。但是Hibernate查詢快取對Iterator不起作用,只對List起作用。

下面我們這種介紹把二級快取和Hibernate查詢快取結合使用。
當只是用Hibernate查詢快取而關閉二級快取的時候:
第一:如果查詢的是部分屬性結果集: 那麼當第二次查詢的時候就不會發出SQL,直接從Hibernate查詢快取中取資料;
第二:如果查詢的是實體結果集eg(from Student) ,首先Hibernate查詢快取存放實體的ID,第二次查詢的時候就到Hibernate查詢快取中取出ID 一條一條的到資料庫查詢,這樣,將發出N 條SQL造成了SQL氾濫。

當都開啟Hibernate查詢快取和二級快取的時候:
第一:如果查詢的是部分屬性結果集: 這個和上面只是用Hibernate查詢快取而關閉 二級快取的時候一致,因為不涉及實體不會用到二級快取;
第二:如果查詢的是實體結果集eg(from Student),首先Hibernate查詢快取存放實體的ID,第二次查詢的時候,就到Hibernate查詢快取中取出ID,到二級快取區找資料,如果有資料,就不會發出SQL;如果都有,一條SQL都不會發出,直接從二級快取中取資料。
 
總結: 查詢快取的key與HQL,查詢引數以及分佈引數有關,而且一旦查詢涉及到的任何一張表的資料發生了變化,快取就失效了,所以在生產環境中命中率較低。查詢快取儲存的是結果集的id列表,而不是結果集本身

,命中快取的時候,會根據id一個一個地先從二級快取查詢 ,找不到再查詢資料庫。

list()沒有使用快取中的實體物件,因為查詢需要查詢到所有符合條件的記錄,因此必須執行SELECT SQL,來保證查詢資料的完整性;而iterate()通過執行SELECT SQL語句來獲取滿足查詢條件的記錄的ID,來保證查詢資料的完整性

相關推薦

Hibernate查詢快取全面分析

這裡介紹Hibernate查詢快取對Iterator不起作用,只對List起作用。 快取分類: ◆一級快取 Session級 ◆二級快取 SessionFactory級別,JVM級別 ◆Hibernate查詢快取不固定(生命週期不固定) 生命週期: ◆一級快取 是和 ses

Hibernate查詢快取

As mentioned above, most queries do not benefit from caching or their results. So by default, individual queries are not cached even after enabling query

hibernate二級快取原理分析

多人對二級快取都不太瞭解,或者是有錯誤的認識,我一直想寫一篇文章介紹一下hibernate的二級快取的,今天終於忍不住了。 我的經驗主要來自hibernate2.1版本,基本原理和3.0、3.1是一樣的,請原諒我的頑固不化。  hibernate的session提供了一級快取

hibernate快取機制詳細分析(一級/二級/查詢快取)

Hibernate: select student0_.id as id2_, student0_.name as name2_, student0_.sex as sex2_, student0_.rid as rid2_ from t_student student0_ where student0_.n

Hibernate 二級快取查詢快取

一級快取:     1,在session上面有一個一級快取;一級快取的生命週期和session相同,一級快取最大生命週期就是一個執行緒;在web環境下面,session的最大生命週期就是一次請求;     2,一級快取可以用來幹嘛? &nb

Hibernate的一級快取、二級快取查詢快取

Hibernate的Session提供了一級快取的功能,預設總是有效的,當應用程式儲存持久化實體、修改持久化實體時,Session並不會立即把這種改變提交到資料庫,而是快取在當前的Session中,除非顯示呼叫了Session的flush()方法或通過close()方法關閉Sessi

談一談Hibernate的一級快取、二級快取查詢快取

Hibernate的Session提供了一級快取的功能,預設總是有效的,當應用程式儲存持久化實體、修改持久化實體時,Session並不會立即把這種改變提交到資料庫,而是快取在當前的Session中,除非顯示呼叫了Session的flush()方法或通過close

Hibernate查詢問題 如何不使用快取 簡單方法

如果 使用HIbernate迴圈查詢某個表的話。他會使用快取技術,來提高資料庫效能。 其思路是:第一次執行某個sql語句,記錄下他的引數。第二次執行某個sql語句時候首先拿他的引數表和預設記錄的引數表相比較,如果引數表一致,那麼hibernate不會重新查詢資料庫,而是從快取

hibernate 二級快取查詢快取原理和關係

一、hibernate的二級快取 如果開啟了二級快取,hibernate在執行任何一次查詢的之後,都會把得到的結果集放到快取中,快取結構可以看作是一個hash table,key是資料庫記錄的id,value是id對應的pojo物件。當用戶根據id查詢物件的時候(load、iterator方法),會首先在

hibernate:真正理解二級快取查詢快取

public class Person { private Person parent; private Set<Person> children; public void setParent(Person p) { parent = p; } public void setChild

SSH框架之Hibernate的集合快取查詢快取、專案中的session管理方式

一、集合快取 1、不使用集合快取: 2、使用集合快取: 1)配置hibernate.cfg.xml 2)測試: 二、補充二級快取、集合快取配置 三、查詢快取 list()

效能優化(一)Hibernate 利用快取(一級、二級、查詢)提高系統性能

      在hibernate中我們最常用的有三類快取,分別為一級快取、二級快取和查詢快取,下面我們對這三個快取在專案中的使用以及優缺點分析一下。       快取它的作用在於提高效能系統性能,介於應用系統與資料庫之間而存在於記憶體或磁碟上的資料。       我們程式設

Hibernate快取體系之查詢快取(query cache),以及list和iterate方法的區別

       Hibernate框架提供了Session.load()和Session.get()方法,用來根據實體物件的主鍵值從資料庫中查詢對應記錄。針對load和get方法,hibernate提供了一級快取和二級快取的支援,提高查詢效率,具體可以參考我的部落格:通過測試

hibernate查詢快取

     查詢快取的配置和使用也是很簡單的:          1>查詢快取的啟用不但要在配置檔案中進行配置              <property name="hibernate.cache.use_query_cache">true</property>        

hibernate查詢快取使用方法詳解

<hibernate-configuration>    <session-factory>      <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:ORCL10<

hibernate快取之【查詢快取

        說到hibernate中的快取我們瞭解的比較多的是一級和二級快取,通過前面兩篇部落格的總結我們知道一級和二級快取主要是快取查詢的實體或實體集的,那麼如果我們是通過HQL或SQL語句查詢

Hibernate框架之查詢快取

一級快取跟二級快取都只能快取實體物件, 而查詢快取可以快取基本屬性, 同時查詢快取也可以快取實體物件, 但是隻能快取其id 查詢快取的生命週期是: 一旦資料庫表的資料發生修改, 則查詢快取則被清掉了 直接使用Hibernate框架提供的查詢快取即可 第一步: 開啟查詢快

hibernate--一級和二級快取(使用Ehcache)以及查詢快取

有一下幾點需要理清才行: 一級快取是session快取 session關閉就小時 二級快取是sessionFactory級別的快取 一個應用程式只有一個 多個執行緒共享  不要把經常修改的物件放到二級快取中 二級快取中放一些查詢的物件 1 首先是在hibernate,cfg

hibernate二級快取查詢快取之間的關係

我們先看一下什麼樣的hibernate操作會將資料存入到一級快取中去,當呼叫下邊這些方法的時候會將資料存入到一級快取中 一級快取 save、update、saveOrupdate、load、list、iterate、lock,例如: User userOne=new Use

Hibernate快取原理與查詢快取的組合探究

來源:http://www.javaeye.com/topic/431603 0.前言          由於對Hibernate的二級快取和查詢快取的區別不瞭解,也不知道它們起什麼作用。於是動手做了一些實驗,對它們的組合使用有了一個表面的認識。 1.前提