Hibernate 一二級緩存

一級緩存(默認開啟),Session緩存,會話級緩存
生命周期:就是session的生命周期,從session創建到session銷毀。
一級緩存中的數據使用范圍在當前session范圍之內

實體類的三種狀態

瞬時態 -> save() 對象里面沒有id值,對象與session沒有關聯
持久態 ->get() 對象里面有id值,對象與session有關聯
托管態 對象里面有id值,對象與session沒有關聯

什么是緩存

  1. 數據存到數據庫里面,數據庫本身就是文件系統,使用流方式操作文件效率不是很高。
    (1) 把數據存到內存當中,不需要使用流方式,可以直接讀取內存中的數據
    (2) 把數據存到內存中,提高讀取效率
    緩存是指為了降低應用程序對物理數據源的訪問的頻次,從而提高應用程序的運行性能的一種策略。
工作原理

Hibernate緩存

  1. hibernate框架中提供很多優化方式,hibernate的緩存就是一個優化方式
  2. 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()區別

  1. 返回的類型不同:

list()返回List;iterate()返回Iterate。

  1. 查詢策略不同:

list()直接發送sql語句,查詢數據庫;

iterate()發送sql語句,從數據庫取出id,然后先從緩存中根據id查找對應信息,

有就返回結果,沒有就根據id發送sql語句,查詢數據庫。

  1. 返回對象不同:

list()返回持久化實體類對象;

iterate()返回代理對象。

  1. 與緩存的關系不同:

list()只緩存,但不使用緩存(查詢緩存除外);

iterate()會使用緩存。

二級緩存(不是默認開啟,需要配置)

全局緩存,應用級緩存,跟sessionFactory相關

Q:如果一些常用的數據,在一個session中緩存以后,我們希望在其他session中也能夠直接使用。

二級緩存配置

一級緩存與二級緩存的比較

一級緩存與二級緩存的比較
總結
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容