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