Mybatis緩存

緩存級(jí)別

MyBatis 提供了兩個(gè)級(jí)別的緩存:一級(jí)緩存和二級(jí)緩存。它們的作用和使用場(chǎng)景如下所示:

一級(jí)緩存(SqlSession 級(jí)別緩存):

作用范圍:一級(jí)緩存是在單個(gè) SqlSession 內(nèi)部有效,因此對(duì)于同一個(gè) SqlSession 中執(zhí)行的相同查詢,查詢結(jié)果會(huì)被緩存在一級(jí)緩存中。
提高性能:當(dāng)多次執(zhí)行相同查詢時(shí),從一級(jí)緩存中獲取結(jié)果,避免再次向數(shù)據(jù)庫(kù)發(fā)起查詢請(qǐng)求,可以提高查詢性能。
減少數(shù)據(jù)庫(kù)壓力:由于查詢結(jié)果已經(jīng)緩存在一級(jí)緩存中,避免了重復(fù)的數(shù)據(jù)庫(kù)查詢,從而減少了數(shù)據(jù)庫(kù)的壓力。
自動(dòng)刷新:一級(jí)緩存會(huì)在執(zhí)行插入、更新、刪除等修改操作時(shí)自動(dòng)刷新,確保數(shù)據(jù)的一致性。
一般無需過多關(guān)注和配置,是默認(rèn)開啟的。
二級(jí)緩存(Mapper 級(jí)別緩存):

作用范圍:二級(jí)緩存是跨 SqlSession 的緩存,可以被多個(gè) SqlSession 共享(即多個(gè)不同的 SqlSession 可以共享相同的緩存數(shù)據(jù))。
接口級(jí)別的緩存:二級(jí)緩存是基于 Mapper 接口的,即同一個(gè) Mapper 接口的不同 SqlSession 可以共享相同的緩存數(shù)據(jù)。
架構(gòu)級(jí)別的緩存:當(dāng)多個(gè)應(yīng)用實(shí)例之間共享同一個(gè)數(shù)據(jù)庫(kù),使用二級(jí)緩存可以提高系統(tǒng)整體的性能。
手動(dòng)配置:需要手動(dòng)在 MyBatis 的配置文件中開啟二級(jí)緩存,并在 Mapper 接口方法上加入相應(yīng)的注解或 XML 配置。
可選的緩存實(shí)現(xiàn):MyBatis提供了多種二級(jí)緩存實(shí)現(xiàn),如基于內(nèi)存的 PerpetualCache 和基于 Redis 的 RedisCache 等,可以根據(jù)實(shí)際需求選擇合適的緩存實(shí)現(xiàn)方式。
綜上所述,MyBatis 緩存的不同級(jí)別都能提供緩存結(jié)果以減少訪問數(shù)據(jù)庫(kù)的次數(shù),提高查詢性能和系統(tǒng)整體性能。一級(jí)緩存適用于同一個(gè) SqlSession 內(nèi)的重復(fù)查詢,而二級(jí)緩存適用于多個(gè) SqlSession 共享同一數(shù)據(jù)源的情況。

緩存的緩存級(jí)別

MyBatis 緩存的緩存級(jí)別主要有三個(gè):Statement 級(jí)別緩存、SqlSession 級(jí)別緩存以及 Mapper 接口級(jí)別緩存。下面分別對(duì)這三個(gè)級(jí)別的緩存進(jìn)行詳細(xì)介紹:

  1. Statement 級(jí)別緩存(Local Cache):

    • 作用范圍:Statement 級(jí)別緩存是在 SQL 執(zhí)行環(huán)境內(nèi)的緩存,用于緩存同一個(gè) SQL 語句的執(zhí)行結(jié)果。
    • 生命周期:Statement 級(jí)別緩存的生命周期是短暫的,僅限于同一個(gè) SQL 語句執(zhí)行過程中的多次查詢,即在同一個(gè) SQL 語句執(zhí)行期間,后續(xù)執(zhí)行相同的 SQL 語句可以直接從緩存中獲取結(jié)果。
    • 默認(rèn)開啟:Statement 級(jí)別緩存在 MyBatis 中默認(rèn)是開啟的,會(huì)根據(jù)配置進(jìn)行相關(guān)操作。
    • 適用場(chǎng)景:適用于多次執(zhí)行相同 SQL 語句的查詢,提高查詢性能,但不適用于緩存結(jié)果跨 SQL 語句的查詢。
  2. SqlSession 級(jí)別緩存(Per-Session Cache):

    • 作用范圍:SqlSession 級(jí)別緩存是在同一個(gè) SqlSession 內(nèi)部有效,對(duì)于同一個(gè) SqlSession 中執(zhí)行的相同查詢,查詢結(jié)果會(huì)被緩存在一級(jí)緩存中。
    • 生命周期:SqlSession 級(jí)別緩存的生命周期與 SqlSession 的生命周期一致,在 SqlSession 關(guān)閉之后緩存將失效。
    • 自動(dòng)刷新:在執(zhí)行插入、更新、刪除操作時(shí),SqlSession 級(jí)別緩存會(huì)自動(dòng)刷新,保證數(shù)據(jù)的一致性。
    • 默認(rèn)開啟:一級(jí)緩存在 MyBatis 中默認(rèn)是開啟的,通常無需手動(dòng)配置。
    • 適用場(chǎng)景:適用于同一個(gè) SqlSession 內(nèi)多次執(zhí)行相同查詢,避免重復(fù)的數(shù)據(jù)庫(kù)查詢,提高查詢性能,但不能在多個(gè) SqlSession 之間共享緩存結(jié)果的情況。
  3. Mapper 接口級(jí)別緩存(Mapper Cache):

    • 作用范圍:Mapper 接口級(jí)別緩存是在 Mapper 接口的方法級(jí)別上進(jìn)行緩存,可由多個(gè) SqlSession 對(duì)象共享。
    • 生命周期:Mapper 接口級(jí)別緩存的生命周期與應(yīng)用程序一致,在應(yīng)用程序關(guān)閉之前一直有效。
    • 手動(dòng)配置:需要在 MyBatis 的配置文件中開啟二級(jí)緩存,并在 Mapper 接口方法上添加相應(yīng)的注解或 XML 配置。
    • 可選的緩存實(shí)現(xiàn):MyBatis 提供了多種二級(jí)緩存實(shí)現(xiàn),如基于內(nèi)存的 PerpetualCache 和基于 Redis 的 RedisCache 等。
    • 適用場(chǎng)景:適用于多個(gè) SqlSession 對(duì)象之間共享相同查詢結(jié)果的場(chǎng)景,可提高系統(tǒng)整體性能。

綜上所述,MyBatis 提供了三個(gè)級(jí)別的緩存:Statement 級(jí)別緩存在 SQL 語句執(zhí)行期間生效,SqlSession 級(jí)別緩存在同一個(gè) SqlSession 內(nèi)部有效,Mapper 接口級(jí)別緩存在多個(gè) SqlSession 之間共享。

MyBatis 默認(rèn)使用的是 SqlSession 級(jí)別的緩存(Per-Session Cache)。該緩存級(jí)別是在同一個(gè) SqlSession 中進(jìn)行的緩存,對(duì)于同一個(gè) SqlSession 中執(zhí)行的相同查詢,查詢結(jié)果會(huì)被緩存在一級(jí)緩存中。SqlSession 級(jí)別的緩存在 MyBatis 中是默認(rèn)開啟的,通常無需手動(dòng)配置。

sqlsession 是針對(duì)每個(gè)http請(qǐng)求嗎

SQLSession 不是針對(duì)每個(gè) HTTP 請(qǐng)求的,而是針對(duì)每個(gè)數(shù)據(jù)庫(kù)連接的。

在使用 SQLSession 時(shí),我們需要先創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接,然后通過這個(gè)連接創(chuàng)建一個(gè) SQLSession 對(duì)象。在一個(gè)數(shù)據(jù)庫(kù)連接中,可以創(chuàng)建多個(gè) SQLSession 對(duì)象,這些 SQLSession 對(duì)象可以在不同的線程中使用,執(zhí)行數(shù)據(jù)庫(kù)的查詢、插入、更新和刪除等操作。

在一個(gè) HTTP 請(qǐng)求中,可以重用之前的 SQLSession 對(duì)象,從而實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作的復(fù)用,提高性能。但是需要注意,在多線程的環(huán)境中,每個(gè)線程需要擁有自己的 SQLSession 對(duì)象,不要共享同一個(gè) SQLSession 對(duì)象,以免發(fā)生線程安全的問題。

SQLSession的創(chuàng)建在單實(shí)例中會(huì)重建嗎

在單實(shí)例中,SQLSession 的創(chuàng)建一般是在應(yīng)用程序啟動(dòng)時(shí)進(jìn)行,然后在整個(gè)應(yīng)用程序的生命周期中重用同一個(gè) SQLSession 對(duì)象。這樣可以減少數(shù)據(jù)庫(kù)連接的創(chuàng)建和銷毀的開銷,提高數(shù)據(jù)庫(kù)操作的性能。

所以,在單實(shí)例中,不會(huì)頻繁地創(chuàng)建和銷毀 SQLSession 對(duì)象。一般情況下,在應(yīng)用程序啟動(dòng)時(shí)創(chuàng)建 SQLSession 對(duì)象,并在應(yīng)用程序關(guān)閉時(shí)手動(dòng)關(guān)閉 SQLSession 對(duì)象。

需要注意的是,雖然在單實(shí)例中重用同一個(gè) SQLSession 對(duì)象,但每個(gè)線程仍然需要擁有自己的 SQLSession 對(duì)象,以免發(fā)生線程安全的問題??梢允褂镁€程池或者 ThreadLocal 來管理 SQLSession 對(duì)象,在每個(gè)線程中獲取自己的 SQLSession 對(duì)象,從而保證線程安全。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容