這篇文章主要介紹了MyBatis關於二級緩存問題,二級緩存是Mapper層級的緩存,多個sqlSession操作同一個Mapper,其二級緩存是可以共享的。
MyBatis提供一級緩存和二級緩存,其中一級緩存是sqlSession級別的緩存,不同的sqlSession之間的緩存互不影響。二級緩存是Mapper層級的緩存,多個sqlSession操作同一個Mapper,其二級緩存是可以共享的。
MyBatis有多種二級快取方案可供選擇。其中對Memcached的支援較為成熟,現以Memcached為例介紹與spring專案的整合。
使用設定
配置pom.xml,新增依賴。
<dependencies> ... <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-memcached</artifactId> <version>1.0.0</version> </dependency> ... </dependencies>
全域開關
<settings> <setting name="cacheEnabled" value="true"/> </settings>
配置需要快取的mapper.xml
二級快取是Mapper層級的,可以針對具體的mapper.xml開啟二級快取。
<mapper namespace="org.acme.FooMapper"> <cache type="org.mybatis.caches.memcached.MemcachedCache" /> </mapper>
開啟後,則mapper中所有的select語句預設都會被緩存,此命名空間下所有insert、update、delete語句將會導致空間下的快取被清空。
可以針對特定某條語句停用快取。
<select id="retObj" resultMap="results" useCache="false" > select id, name, sex from employee </select>
也可針對某條語句觸發刷新動作(預設對應所有插入、更新、刪除語句)。
<select id="retObj" resultMap="results" flushCache="true" > select id, name, sex from employee </select>
配置參數在memcached.properties中設置,如果缺失則使用預設設定。
以下是設定參數:
如果需要記錄cache操作日誌,可由下列設定實作
<mapper namespace="org.acme.FooMapper"> <cache type="org.mybatis.caches.memcached.LoggingMemcachedCache" /> ... </mapper>
快取在Memcached中的類別需要實作Serializable接口,否則會報錯java.io.NotSerializableException。
二級快取應用程式場景
對查詢頻率高,變化頻率低的資料建議使用二級快取。
對於存取多的查詢請求且使用者對查詢結果即時性要求不高,此時可採用mybatis二級快取技術降低資料庫存取量,提高存取速度,業務場景例如:耗時較高的統計分析sql、電話帳單查詢sql等。
實作方法如下:
透過設定刷新間隔時間,由mybatis每隔一段時間自動清空緩存,根據資料變化頻率設定快取刷新間隔flushInterval,例如設定為30分鐘、60分鐘、24小時等,依需求而定。
mybatis限制
mybatis二級快取對細粒度的資料層級的快取實作不好。
例如如下需求:對商品資訊進行緩存,由於商品資訊查詢訪問量大,但是要求用戶每次都能查詢最新的商品信息,此時如果使用mybatis的二級緩存就無法實現當一個商品變化時只刷新該商品的緩存信息而不刷新其它商品的信息,因為mybaits的二級緩存區域以mapper為單位劃分,當一個商品信息變化會將所有商品資訊的快取資料全部清空。解決此類問題需要在業務層根據需求對資料有針對性快取。
以上是詳解MyBatis關於二級快取問題的程式碼實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

javaispopularforcross-platformdesktopapplicationsduetoits“ writeonce,runany where”哲學。 1)itusesbytiesebyTecodeThatrunsonAnyJvm-備用Platform.2)librarieslikeslikeslikeswingingandjavafxhelpcreatenative-lookingenative-lookinguisis.3)

在Java中編寫平台特定代碼的原因包括訪問特定操作系統功能、與特定硬件交互和優化性能。 1)使用JNA或JNI訪問Windows註冊表;2)通過JNI與Linux特定硬件驅動程序交互;3)通過JNI使用Metal優化macOS上的遊戲性能。儘管如此,編寫平台特定代碼會影響代碼的可移植性、增加複雜性、可能帶來性能開銷和安全風險。

Java將通過雲原生應用、多平台部署和跨語言互操作進一步提昇平台獨立性。 1)雲原生應用將使用GraalVM和Quarkus提升啟動速度。 2)Java將擴展到嵌入式設備、移動設備和量子計算機。 3)通過GraalVM,Java將與Python、JavaScript等語言無縫集成,增強跨語言互操作性。

Java的強類型系統通過類型安全、統一的類型轉換和多態性確保了平台獨立性。 1)類型安全在編譯時進行類型檢查,避免運行時錯誤;2)統一的類型轉換規則在所有平台上一致;3)多態性和接口機制使代碼在不同平台上行為一致。

JNI會破壞Java的平台獨立性。 1)JNI需要特定平台的本地庫,2)本地代碼需在目標平台編譯和鏈接,3)不同版本的操作系統或JVM可能需要不同的本地庫版本,4)本地代碼可能引入安全漏洞或導致程序崩潰。

新興技術對Java的平台獨立性既有威脅也有增強。 1)雲計算和容器化技術如Docker增強了Java的平台獨立性,但需要優化以適應不同雲環境。 2)WebAssembly通過GraalVM編譯Java代碼,擴展了其平台獨立性,但需與其他語言競爭性能。

不同JVM實現都能提供平台獨立性,但表現略有不同。 1.OracleHotSpot和OpenJDKJVM在平台獨立性上表現相似,但OpenJDK可能需額外配置。 2.IBMJ9JVM在特定操作系統上表現優化。 3.GraalVM支持多語言,需額外配置。 4.AzulZingJVM需特定平台調整。

平台獨立性通過在多種操作系統上運行同一套代碼,降低開發成本和縮短開發時間。具體表現為:1.減少開發時間,只需維護一套代碼;2.降低維護成本,統一測試流程;3.快速迭代和團隊協作,簡化部署過程。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Atom編輯器mac版下載
最受歡迎的的開源編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

禪工作室 13.0.1
強大的PHP整合開發環境