Hibernate是Java編程語言的開放源代碼,對象/關係映射框架。Hibernate的目標是幫助開發人員擺脫許多繁瑣的手動數據處理任務。Hibernate能夠在Java類和數據庫表之間以及Java和SQL中的數據類型之間創建映射。
任何處理大量數據的非平凡應用程序都必須依靠緩存和其他技術來提高效率。緩存是一種通過使用緩衝區存儲經常訪問的數據來提高應用程序性能的策略。通過減少數據庫請求的數量並將數據存儲在更靠近CPU的位置,緩存可以顯着提高應用程序的速度。
在本文中,我們將研究如何使用Redisson(一種用於訪問內存中數據結構存儲Redis的Java包裝器)在Hibernate中執行緩存。
Hibernate 第一級 \ 二級緩存
Hibernate使用多級緩存方案。第一級是強制性的,默認情況下處於啓用狀態,而第二級是可選的。
一級緩存
一級緩存(也稱爲L1緩存)與Hibernate的Session對象相關聯,該對象表示Java應用程序和SQL數據庫之間的連接。這意味着僅在會話存在的前提下,一級緩存纔可用。每個第一級緩存只能由與其關聯的Session對象訪問。
首次從數據庫中查詢實體時,該實體將存儲在與該會話關聯的第一級緩存中。在同一會話期間對此實體的任何後續查詢都將從緩存而不是數據庫中檢索實體。
二級緩存
二級緩存(也稱爲L2緩存)默認情況下處於禁用狀態,但可以通過修改Hibernate的配置設置來啓用。該緩存與Hibernate的SessionFactory對象相關聯,主要用於存儲應在Session之間持久的數據。在查找第二級緩存之前,應用程序將始終在第一級緩存中搜索給定實體的存在。
Hibernate還具有第三種類型的緩存:查詢緩存,用於存儲特定數據庫查詢的結果。當您需要使用相同的參數多次運行相同的查詢時,這很有用
Hibernate中的二級緩存有幾種不同的實現,包括Ehcache和OSCache。在本文的其餘部分中,我們將探討Hibernate中用於二級緩存的另一個選項:Redisson,它允許將Redis用作Hibernate緩存
如何使用Hibernate和Redis進行緩存
源碼案例- RedissonCacheRegionFactory
選擇策略
Redisson是Java中的Redis客戶端,其中包含許多Java對象和服務的實現,包括Hibernate緩存。Redisson支持所有四種Hibernate緩存策略:
- READ_ONLY:僅用於在緩存內部不會更改的實體。
- NONSTRICT_READ_WRITE:在事務修改數據庫中的實體之後,更新緩存。無法保證強一致性,但可以保證最終一致性。
- READ_WRITE:通過使用“軟”鎖來保證強一致性,這些鎖將保持對實體的控制,直到事務完成爲止。
- 事務性:通過使用分佈式XA事務確保數據完整性。確保將更新提交或回滾到數據庫和緩存。
Redisson提供了各種Hibernate CacheFactories,包括那些支持本地緩存的。如果您打算將Hibernate緩存主要用於讀取操作,或者您不想進行太多的網絡往返,則本地緩存是一個明智的解決方案。
該 RedissonRegionFactory 工具實現了基本的Hibernate緩存,而 RedissonLocalCachedRegionFactory (在Redisson PRO版本中可用)實現了具有本地緩存支持的Hibernate緩存。
配置依賴
redisson-hibernate 可以使用Maven或Gradle 將 依賴項輕鬆集成到您的項目中。對於JDK 1.8,Maven設置爲:
<dependency>
<groupId>org.redisson</groupId>
<!-- for Hibernate v4.x -->
<artifactId>redisson-hibernate-4</artifactId>
<!-- for Hibernate v5.0.x - v5.1.x -->
<artifactId>redisson-hibernate-5</artifactId>
<!-- for Hibernate v5.2.x -->
<artifactId>redisson-hibernate-52</artifactId>
<!-- for Hibernate v5.3.x - v5.4.x -->
<artifactId>redisson-hibernate-53</artifactId>
<version>3.10.2</version>
</dependency>
並且Gradle設置是:
// for Hibernate v4.x
compile 'org.redisson:redisson-hibernate-4:3.10.2'
// for Hibernate v5.0.x - v5.1.x
compile 'org.redisson:redisson-hibernate-5:3.10.2'
// for Hibernate v5.2.x
compile 'org.redisson:redisson-hibernate-52:3.10.2'
// for Hibernate v5.3.x - v5.4.x
compile 'org.redisson:redisson-hibernate-53:3.10.2'
要CacheFactory 在Redisson中定義 in,請在Hibernate配置中插入適當的屬性:
<!-- Redisson Region Cache factory -->
<property name="hibernate.cache.region.factory_class" value="org.redisson.hibernate.RedissonRegionFactory" />
<!-- or -->
<property name="hibernate.cache.region.factory_class" value="org.redisson.hibernate.RedissonLocalCachedRegionFactory" />
激活配置
您還需要激活Hibernate的二級緩存並指定Redisson配置文件:
<!-- 2nd level cache activation -->
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<!-- Redisson YAML config (located in filesystem or classpath) -->
<property name="hibernate.cache.redisson.config" value="/redisson.yaml" />
<!-- Redisson JSON config (located in filesystem or classpath) -->
<property name="hibernate.cache.redisson.config" value="/redisson.json" />
配置緩存參數
Redisson允許您爲Hibernate緩存更改許多不同的重要參數,包括:
- Redis中緩存的最大大小
- Redis中每個緩存條目的生存時間
- Redis中每個緩存條目的最大空閒時間
- 本地緩存的最大大小
- 每個本地緩存條目的生存時間
每個本地緩存條目的最大空閒時間
一旦達到高速緩存的最大大小(LFU,LRU,SOFT,WEAK或NONE),就對本地高速緩存逐出策略
跨所有實例將更改同步到本地緩存的策略(INVALIDATE,UPDATE或NONE)
連接失敗(CLEAR,LOAD或NONE)後重新加載丟失的更新的重新連接策略
Hibernate 二級緩存 - RedissonCacheRegionFactory
mPaaS(Microservice PaaS) 微服務開發平臺 基於SpringBoot2.x、SpringCloud並採用前後端分離的多租戶系統架構微服務開發平臺
喜歡閱讀Spring、SpringBoot、SpringCloud等底層源碼的可以關注下mPass 微服務開發平臺,期待您的寶貴意見!