一級緩存(默認開啟),Session緩存,會話級緩存
生命周期:就是session的生命周期,從session創建到session銷毀。
一級緩存中的數據使用范圍在當前session范圍之內
實體類的三種狀態
瞬時態 -> save() 對象里面沒有id值,對象與session沒有關聯
持久態 ->get() 對象里面有id值,對象與session有關聯
托管態 對象里面有id值,對象與session沒有關聯
什么是緩存
- 數據存到數據庫里面,數據庫本身就是文件系統,使用流方式操作文件效率不是很高。
(1) 把數據存到內存當中,不需要使用流方式,可以直接讀取內存中的數據
(2) 把數據存到內存中,提高讀取效率
緩存是指為了降低應用程序對物理數據源的訪問的頻次,從而提高應用程序的運行性能的一種策略。
工作原理
Hibernate緩存
- hibernate框架中提供很多優化方式,hibernate的緩存就是一個優化方式
- hibernate緩存特點:
第一類:hibernate的一級緩存
(1) hibernate的一級緩存是默認打開的
(2) hibernate的一級緩存使用范圍,是session從創建到關閉的范圍內
(3) hibernate的一級緩存中存儲的數據必須是持久態的數據
第二類:hibernate的二級緩存
(1) 目前已經不再使用了,用redis代替
(2) 二級緩存默認是不打開的,需要配置
(3) 二級緩存的使用范圍是sessionFactory的范圍
//發送sql語句
User user=session.get(User.class,id)
//不會發送sql語句
User user=session.get(User.class,id)
持久態會自動更新數據庫
User user=session,get(User.class,id)
user.setName="韓梅梅"
//事務提交的時候會自動更新數據庫,不需要明顯的update()操作
//session.update(user)
持久態自動更新數據庫
Imooc
session.evict(entity): 將某個對象從一級緩存中刪除
session.clear(): 清除一級緩存中的所有對象
Query query=session.createQuery("from user");
List<User> list=query.list(); //會發送sql語句
//query.list()方法是不會使用到緩存的
List<User> list=query.list(); //還會發送sql語句
Iterator it=query.iterator();
while(it.hasNext()){
User user=(User) it.next();
syso(user);
}
//iterator原理: 根據query查詢到實體對應的主鍵id列表
//如果id對應的對象數據在緩存中能找到則讀取緩存
//如果id對應的數據不能在緩存中找到則發送sql語句讀取數據庫
query.list()和query.iterate()區別
- 返回的類型不同:
list()返回List;iterate()返回Iterate。
- 查詢策略不同:
list()直接發送sql語句,查詢數據庫;
iterate()發送sql語句,從數據庫取出id,然后先從緩存中根據id查找對應信息,
有就返回結果,沒有就根據id發送sql語句,查詢數據庫。
- 返回對象不同:
list()返回持久化實體類對象;
iterate()返回代理對象。
- 與緩存的關系不同:
list()只緩存,但不使用緩存(查詢緩存除外);
iterate()會使用緩存。
二級緩存(不是默認開啟,需要配置)
全局緩存,應用級緩存,跟sessionFactory相關
Q:如果一些常用的數據,在一個session中緩存以后,我們希望在其他session中也能夠直接使用。
二級緩存配置
一級緩存與二級緩存的比較
一級緩存與二級緩存的比較
總結