MyBatis中的一級緩存

 private <E> List<E> queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
    List<E> list;
    //當第一次請求時,先把計算出來的key緩存放入一個佔位符,當有數據時,在進行put真實的數據
    localCache.putObject(key, EXECUTION_PLACEHOLDER);
    try {
      list = doQuery(ms, parameter, rowBounds, resultHandler, boundSql);
    } finally {
      localCache.removeObject(key);
    }
    localCache.putObject(key, list);
    if (ms.getStatementType() == StatementType.CALLABLE) {
      localOutputParameterCache.putObject(key, parameter);
    }
    return list;
  }

第一次請求,本地緩存

localCache.putObject(key,EXECUTION_PLACEHOLDER)   放入一個佔位符

執行完SQL,獲取到數據時,把佔位符緩存刪除,然後在put真實的數據

    try {
      list = doQuery(ms, parameter, rowBounds, resultHandler, boundSql);
    } finally {
      localCache.removeObject(key);
    }

   放入真實的數據
    localCache.putObject(key, list);

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章