Hibernate和Jive快取策略的比較

2021-04-03 01:19:52 字數 3876 閱讀 6593

一.基本概念

po是持久化物件,它只是對物理資料實體的一種物件表示。

vo是值物件,準確地講,它是業務物件。

formbean只是html表單的封裝,起到在控制層弱化的request中儲存資料的作用,將request的get方法轉

變為物件的訪問值。

二.快取策略比較

jive

1.jive的快取策略的過程描述:

(1)條件查詢的時候,jive用 select id from table_name where …. (只選擇id欄位)這樣的sql語句查詢資料庫,來獲得乙個id列表。

(2) jive根據id列表中的每個id,首先檢視快取中是否存在對應id的資料物件:如果存在,那麼直接取出,加入到 結果列表中;如果不存在,那麼通過一條select * from table_name where id = 這樣的sql查詢資料庫,取出對應的資料物件,放入到結果列表,並把這個資料物件按照id放入到快取中。

(3) id查詢的時候,jive執行類似第(2)步的過程,先從快取中查詢該id,查不到,再查詢資料庫,然後把結果放入到快取。

(4) 刪除、更新、增加資料的時候,同時更新快取。

2.jive快取策略的優點:

(1) id查詢的時候,如果該id已經存在於快取中,那麼可以直接取出。節省了一條資料庫查詢。

(2) 當多次條件查詢的結果集相交的情況下,交集裡面的資料物件不用重複從資料庫整個獲取,直接從快取中獲取即可。比如,第一次查詢的id列表為,然後根據id列表的id從資料庫中乙個乙個取出資料物件,結果集為。下一次查詢的id列表為,由於id = 2的資料物件已經存在於快取中,那麼只要從資料庫中取出id = 3的資料物件即可。

3.jive快取策略的缺點:

(1) 在根據條件查詢資料物件列表的過程中,dao的第(1)步用來獲得id列表的那一次資料庫查詢,是必不可少的。

(2) 如果第(1)步返回的id列表中有n個id,在最壞的命中率(快取中乙個對應id都沒有)情況下,jive還要再查詢n次資料庫。最壞情況下,共需要n + 1資料庫查詢。

hibernate

hibernate用session類包裝了資料庫連線從開啟到關閉的過程。session內部維護乙個資料物件集合,包括了本session內選取的、操作的資料物件。這稱為session內部快取,是hibernate的第一級最快快取,屬於hibernate的既定行為,不需要進行配置。

session的生命期很短,存在於session內部的第一級最快快取的生命期當然也很短,命中率自然也很低。當然,這個session內部快取的主要作用是保持session內部資料狀態同步。如果需要跨session的命中率較高的全域性快取,那麼必須對hibernate進行二級快取配置。一般來說,同樣資料型別(class)的資料物件,共用乙個二級快取(或其中的同一塊)。

1.hibernate二級快取策略的過程描述:

(1)條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有字段)這樣的sql語句查詢資料庫,一次獲得所有的資料物件。

(2) 把獲得的所有資料物件根據id放入到第二級快取中。

(3) 當hibernate根據id訪問資料物件的時候,首先從session一級快取中查;查不到,如果配置了二級快取,那麼從二級快取中查;查不到,再查詢資料庫,把結果按照id放入到快取。

(4) 刪除、更新、增加資料的時候,同時更新快取。

2.hibernate二級快取策略的優點:

(1) 具有jive快取策略同樣的第(1)條優點:id查詢的時候,如果該id已經存在於快取中,那麼可以直接取出。節省了一條資料庫查詢。

(2) 不具有jive快取策略的第(2)條缺點,即hibernate不會有最壞情況下的 n + 1次資料庫查詢。

3.hibernate二級快取策略的缺點:

(1) 同jive快取策略的第(1)條缺點一樣,條件查詢的時候,第(1)步的資料庫查詢語句是不可少的。而且hibernate選擇所有的字段,比只選擇id欄位花費的時間和空間都多。

(2) 不具備jive快取策略的第(2)條優點。條件查詢的時候,必須把資料庫物件從資料庫中整個取出,即使該資料庫的id已經存在於快取中。

hibernate的query快取策略

可以看到,jive快取和hibernate的二級快取策略,都只是針對於id查詢的快取策略,對於條件查詢則毫無作用。(儘管jive快取的第(2)個優點,能夠避免重複從資料庫獲取同乙個id對應的資料物件,但select id from …這條資料庫查詢是每次條件查詢都必不可少的)。

為此,hibernate提供了針對條件查詢的query快取。

1.hibernate的query快取策略的過程描述:

(1) 條件查詢的請求一般都包括如下資訊:sql, sql需要的引數,記錄範圍(起始位置rowstart,最大記錄個數maxrows),等。

(2) hibernate首先根據這些資訊組成乙個query key,根據這個query key到query快取中查詢對應的結果列表。如果存在,那麼返回這個結果列表;如果不存在,查詢資料庫,獲取結果列表,把整個結果列表根據query key放入到query快取中。

(3) query key中的sql涉及到一些表名,如果這些表的任何資料發生修改、刪除、增加等操作,這些相關的query key都要從快取中清空。

2.hibernate的query快取策略的優點

(1) 條件查詢的時候,如果query key已經存在於快取,那麼不需要再查詢資料庫。命中的情況下,一次資料庫查詢也不需要。

3.hibernate的query快取策略的缺點

(1) 條件查詢涉及到的表中,如果有任何一條記錄增加、刪除、或改變,那麼快取中所有和該錶相關的query key都會失效。

比如,有這樣幾組query key,它們的sql裡面都包括table1。

sql = select * from table1 where c1 = ? …., parameter = 1, rowstart = 11, maxrows = 20.

sql = select * from table1 where c1 = ? …., parameter = 1, rowstart = 21, maxrows = 20.

sql = select * from table1 where c1 = ? ….., parameter = 2, rowstart = 11, maxrows = 20.

sql = select * from table1 where c1 = ? ….., parameter = 2, rowstart = 11, maxrows = 20.

sql = select * from table1 where c2 = ? …., parameter = 『abc』, rowstart = 11, maxrows = 20.

當table1的任何資料物件(任何字段)改變、增加、刪除的時候,這些query key對應的結果集都不能保證沒有發生變化。很難做到根據資料物件的改動精確判斷哪些query key對應的結果集受到影響。最簡單的實現方法,就是清空所有sql包含table1的query key。

(2) query快取中,query key對應的是資料物件列表,假如不同的query key對應的資料物件列表有交集,那麼,交集部分的資料物件就是重複儲存的。

比如,query key 1對應的資料物件列表為,query key 2對應的資料物件列表為,這個a就在兩個list同時存在了兩份。

4.二級快取和query快取同步的困惑

假如,query快取中,乙個query key對應的結果列表為; 二級快取裡面有也id = 1對應的資料物件a。

這兩個資料物件a之間是什麼關係?能夠保持狀態同步嗎?我閱讀hibernate的相關原始碼,沒有發現兩個快取之間的這種同步關係。或者兩者之間毫無關係。就像我上面所說的,只要表資料發生變化,相關的query key都要被清空。所以不用考慮同步問題?

Hibernate和Jive快取策略的比較

hibernate和jive快取策略的比較 一 基本概念 po是持久化物件,他只是對物理資料實體的一種物件表示。vo是值物件,準確地講,他是業務物件。formbean只是html表單的封裝,起到在控制層弱化的request中儲存資料的作用,將request的get方法轉 變為物件的訪問值。二 快取策...

Hibernate分頁和投影

分頁 dao 分頁查詢 param index param pagesize return public listfindbypage integer index,integer pagesize service public listfindbypage integer index,integer...

spring MVC和hibernate的結合

我們在沒有用註解寫spring配置檔案的時候 會在spring配置檔案中定義dao層的bean,這樣我們在service層中,寫setdao方法,就可以直接通過介面呼叫dao層。用了註解寫法後 在配置檔案中不用再寫dao層的bean。只需要在dao實現類中加入 repository public c...