在Hibernate框架中詳談一級快取

2022-04-11 22:03:52 字數 2070 閱讀 6295

在學習hibernate的過程中我們肯定會碰上乙個名詞---快取,一直都聽說快取機制是hibernate中的乙個難點,它分為好幾種,有一級快取,二級快取和查詢快取

今天呢,我就跟大家分享分享我所理解的一級快取

要想完美的體現出快取機制的話,我想通過查詢語句生成的sql應該就能夠很清楚的看到

那些hibernate的配置資訊我就不展示了,直接看關鍵**

場景:我要查詢同乙個物件,查詢兩次,觀察在不同的情況下,sql語句的生成情況

我事先準備了乙個hibernateutil工具類,具體如下

package util;

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()

}

正常我們訪問db端時應該是訪問幾次就傳送幾次sql,如下所示

//

查詢學生資訊

public

static

void

select

()

結果應該是這樣

那麼問題就來了,我們現在有如下幾個場景

場景一:使用同乙個session連續查詢兩次同乙個物件

//

查詢學生資訊

public

static

void

select

()

這個時候我們不難發現,此時我查詢的是同乙個物件,按照正常理解,我查詢了兩遍應該向db端傳送兩條sql語句才對,下面看看實際的sql數

這個時候可能有的小夥伴就有疑問了,我們後面再解釋這種情況,我們先接著看第二種場景

場景二:在第一次查詢完畢後,關閉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次,那麼對於前面提到的四個步驟可以得到很高的...