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);