經過大量的測試,查詢和快取之間的關係已經基本上清楚了。
1. 一次查詢過後,結果集中的所有個體都會進入持久化上下文,也就是一級快取中(如果開啟了二級快取,它們也同樣會進入二級快取)。這就是意味著後面的程式如果要load(不是查詢)結果集中的任何乙個物件都會從快取中直接命中,不會生成任何sql去hit資料庫。
2. 但是作為結果集的整體,在不使用查詢快取的前提下是不會被快取的。舉個例子:當執行乙個得到某個班級所有學生的查詢後,這個班級所有的學生例項會被載入並進行入快取中。但是快取並沒有快取「這些學生都是某乙個班級」這層關係!因此,當再次執行這個查詢時,依然會生成sql再次訪問資料庫。想要快取查詢結果,在這個例子中也就是快取
「這些學生都是某乙個 班級」的這層關係,就得使用查詢快取!對於
查詢快取來說,
構成key的是:hql生成的sql、sql的引數、排序、分頁資訊等。
我想查詢不會先從快取中查詢物件的根本原因在於,即使hibernate發現快取中有符合條件的
物件,但也無法證實這些物件是結果的全集。因為快取中的資料只是一小部分,所以它必須要生成sql去資料庫中查詢。
如果使用了「query cache」,對乙個查詢來說,對它的快取是這樣處理的:查詢的結果集做為value,放置於查詢快取的region中。注意:這裡存在的並不是真正的結果集。因為查詢出來的例項已經放入了二級快取,所以查詢快取不會重複儲存這些例項,而是只儲存例項的id。這一點在jpwh一書的15.4.2中作過解釋。對於key,它應該是乙個可以用來唯一標識這個查詢的東西,在hibernate中查詢快取的key由
hql生成的sql、 sql的引數、排序、分頁等資訊組成,
通過它我們可以明確地區別不同的查詢,以便某個查詢在下一次重複執行時可以能過這個key直接命中結果集。
維護查詢快取會對系統帶來一定的負荷,因為hibernate必須追蹤結果集中涉及的各類物件是否發生了改動,因為一旦它們發生了改動,這些物件就可能不再是結果集中一員,又或者原來不在結果集中的物件應該進入結果集,這樣當前快取的這個結果集就失效了,必須重新生成sql進行查詢。
mysql查詢和快取原理
mysql資料庫查詢步驟和快取原理 我們曉得,資料庫的查詢功能是我們經常用到的,那麼mysql資料庫是如何進行查詢的呢?本文我們就來引見一下mysql資料庫的查詢步調以及快取本理,接下來就讓我們來一路領會一下那一部門內容。當mysql收到客戶端傳送的查詢語句時,起首會查抄快取塊外能否快取外此語句的成...
快取和緩衝
1,緩衝 buffer 緩衝的作用就是協調上下層應用之間的效能差異 上下層的效能差異會導致資料的不協調,需要加乙個緩衝區,通過緩衝區的緩衝,當上層元件效能優於下層元件的時候,緩衝可以有效減少上層元件對下層元件等待的組織基於這樣的結構,上層元件就不需要等待下層元件完全接收全部資料,即可返回進行其他操作...
快取擊穿和快取穿透的區別 快取穿透和快取擊穿處理
為了應對越來越大的流量,快取便成為系統服務必不可少的一部分,但使用快取就會出現快取擊穿和快取穿透的威脅。背景介紹 網際網路應用逐步深入到生活的各個角落,為了滿足越來越多使用者使用網際網路應用的需求,幾乎所有網際網路公司都採用快取的方案來解決瞬時流量超高,或者長期流量過高的問題。但使用快取存在風險 快...