在學習hibernate的過程中我們肯定會碰上乙個名詞---快取,一直都聽說快取機制是hibernate中的乙個難點,它分為好幾種,有一級快取,二級快取和查詢快取
今天呢,我就跟大家分享分享我所理解的一級快取
要想完美的體現出快取機制的話,我想通過查詢語句生成的sql應該就能夠很清楚的看到
那些hibernate的配置資訊我就不展示了,直接看關鍵**
場景:我要查詢同乙個物件,查詢兩次,觀察在不同的情況下,sql語句的生成情況
我事先準備了乙個hibernateutil工具類,具體如下
package util;正常我們訪問db端時應該是訪問幾次就傳送幾次sql,如下所示import org.hibernate.session;
import org.hibernate.sessionfactory;
import org.hibernate.cfg.configuration;
public
class
hibernateutil
catch
(throwable ex)
}//獲取session
public
static
session currentsession()
return
session;
}//關閉session
public
static
void
closesession()
}
//結果應該是這樣查詢學生資訊
public
static
void
select
()
那麼問題就來了,我們現在有如下幾個場景
場景一:使用同乙個session連續查詢兩次同乙個物件
//這個時候我們不難發現,此時我查詢的是同乙個物件,按照正常理解,我查詢了兩遍應該向db端傳送兩條sql語句才對,下面看看實際的sql數查詢學生資訊
public
static
void
select
()
這個時候可能有的小夥伴就有疑問了,我們後面再解釋這種情況,我們先接著看第二種場景
場景二:在第一次查詢完畢後,關閉session物件,重新開啟乙個session然後繼續查詢同乙個物件
//這個時候我們查詢的任然是同乙個物件,結果卻如下圖查詢學生資訊
public
static
void
select
()
那麼,通過以上兩個場景的模擬,有些小夥伴可能已經明白是怎麼回事了,可能有些小夥伴們還有些迷糊,下面我就講講我的看法吧~
總結:1:當我沒有關閉session時用的同乙個session兩次訪問同乙個物件時,只會向db端傳送一條sql語句
* 原因:因為我第一次訪問資料庫的時候hibernate會自動的將我查詢出來的結果保留乙份查詢出來的物件到一級快取
並且這個額物件是根據oid唯一標識的,也可以理解為資料庫中的主鍵值,然後當我再一次訪問乙個物件時,hibernate
機制會自動的先去一級快取中查詢看有沒有oid與我要查詢的oid相同的物件,如果有的話,則直接從一級快取中 拿資料
如果沒有相同的oid則說明快取中沒有我要的記錄,那麼就會直接去訪問db端了,這樣的話,又會重新傳送一條sql
2:當我第一次查詢完資料後立即關閉session,這時重新開啟乙個session來訪問同乙個物件,這時我們會發現它居然向資料庫傳送了兩條sql語句。這是為什麼呢?
* 原因:
其實原因很簡單,因為我們雖然說是訪問的同乙個物件,但是我們隨即就關閉了這個session而重新開啟了乙個session,
此時我們訪問時的session是不一致的
也就是說是兩個不同的session發出的請求,這樣理解的話,我們就不難理解了。
所以總結出,一級快取是乙個會話級別的快取,當一次回話結束後該會話裡的快取則會全部的銷毀,所有我們自然就只能重新傳送一條sql啦。
詳談Mybatis和Hibernate 的區別
mybatis是乙個不完全的orm 物件關係對映 框架,因為它需要程式設計師自己編寫sql語句,而hibernate是乙個完全的orm框架。mybatis學習門檻低,簡單易學,而hibernate較為複雜,不易精通。mybatis可以直接編寫原生態的sql,可以嚴格控制sql執行效能,進行更細緻的s...
Hibernate框架中的快取
1.快取的作用 降低程式訪問資料庫頻率,提高程式執行的效能。2.hibernate中的快取有如下幾種 1 一級快取 session 是一直存在的 不能被禁止 2 二級快取 sessionfactory 不是必然的,必須手動配置。二級快取中的資料面向所有session共享 session能獲取到二級快...
詳談塊裝置的內部框架
塊裝置提出原因 對於塊裝置的操作 讀取塊 修改讀出的資料 擦除塊 把資料寫入塊。為了提高效率,我們對於塊裝置採取一種措施 先合併請求,然後在根據合併後的請求來操作塊裝置,這樣可以使得塊裝置的操作次數降到最低。例如對同一塊的不同扇區讀取n此,通過和並就變為1次,那麼對於前面提到的四個步驟可以得到很高的...