首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

MyBatis 一級緩存機制詳解:SqlSession 級別的查詢加速與髒讀防範

     編輯:Java 相關知識

一級緩存核心原理

  • 生命週期:綁定 SqlSession,openSession() 到 close() 之間有效
  • 存儲結構:Executor 內部維護 Map<CacheKey, Object>
  • 查詢流程:同一 SQL + 同一參數 → 先查緩存 → 命中返回 → 未命中查庫 → 寫入緩存 → 返回

緩存失效觸發條件

  1. 增刷改提交:session.commit() 或 session.flushStatements() 清空緩存
  2. 手動清空:session.clearCache()
  3. Session 關閉:session.close() 銷毀緩存對象

髒讀風險演示

@Test
public void testCacheLever1() {
    SqlSession session = factory.openSession();
    UserMapper mapper = session.getMapper(UserMapper.class);

    // 第一次查詢 → 查數據庫 → 寫入緩存
    User user = mapper.findUserById(1);
    System.out.println(user);

    // 修改數據但未提交 → 緩存未清空
    user.setUsername("yyyy");
    mapper.updateUser(user);
    // session.commit();  // 若註釋這行,緩存不會清空

    // 第二次查詢 → 直接讀緩存 → 返回舊數據(髒讀!)
    User user2 = mapper.findUserById(1);
    System.out.println(user2);  // 仍顯示修改前的數據

    session.close();
}

最佳實踐建議

  1. 默認開啟:無需額外配置,MyBatis 默認啟用一級緩存
  2. 業務邊界與 Session 對齊:一個業務事務對應一個 SqlSession,提交即清空,天然避免髒讀
  3. 跨 Session 查詢共享需求:請使用二級緩存(參考《MyBatis 二級緩存深度解析》)
  4. 只讀場景可關閉:<select useCache="false"> 強制查庫,適用實時性極高的數據

局限性總結

一級緩存無法跨 SqlSession 共享,高併發下命中率有限。若需全局共享,必須升級至二級緩存或引入 Redis 等分佈式緩存方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved