Mybatis 소개 캐 시
Mybatis
Mybatis , , 。 SqlSession , SqlSession SQL , , , 1024 SQL。 SqlSession 。
Mybatis SQL org.apache.ibatis.executor.Executor , , , BaseExecutor, CachingExecutor。 , , , , BaseExecutor 。
8.1
, BaseExecutor query() , PerpetualCache ,PerpetualCache HashMap 。 、 、 。
public List query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
ErrorContext.instance().resource(ms.getResource()).activity("executing a query").object(ms.getId());
if (closed) {
throw new ExecutorException("Executor was closed.");
}
if (queryStack == 0 && ms.isFlushCacheRequired()) {
clearLocalCache();
}
List list;
try {
queryStack++;
list = resultHandler == null ? (List) localCache.getObject(key) : null;
if (list != null) {
handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);
} else {
list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);
}
} finally {
queryStack--;
}
if (queryStack == 0) {
for (DeferredLoad deferredLoad : deferredLoads) {
deferredLoad.load();
}
// issue #601
deferredLoads.clear();
if (configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT) {
// issue #482
clearLocalCache();
}
}
return list;
}
SESSION STATEMENT , SESSION, , STATEMENT, Mapper 。 , Mybatis , localCacheScope 。
, , testCache1 , SqlSession SQL, SQL。 testCache2 , SQL, SqlSession, SQL 。 Mybatis Spring , Spring Mapper , Mapper SqlSession , , 。 SqlSession。 MapperFactoryBean , SqlSessionDaoSupport SqlSessionFactory SqlSessionTemplate 。
/**
* , SqlSession 。
* : Spring Mybatis, Mapper , SqlSession。 , testCache() , @Transactional 。
*/
@Test
public void testCache() {
PersonMapper mapper = session.getMapper(PersonMapper.class);
mapper.findById(5L);
mapper.findById(5L);
}
@Test
public void testCache2() {
SqlSession session1 = this.sessionFactory.openSession();
SqlSession session2 = this.sessionFactory.openSession();
session1.getMapper(PersonMapper.class).findById(5L);
session2.getMapper(PersonMapper.class).findById(5L);
}
8.2
8.2.1
, , Mybatis cacheEnabled false。
cacheEnabled , true , Executor CachingExecutor。 Mybatis org.apache.ibatis.session.Configuration newExecutor 。
public Executor newExecutor(Transaction transaction, ExecutorType executorType) {
executorType = executorType == null ? defaultExecutorType : executorType;
executorType = executorType == null ? ExecutorType.SIMPLE : executorType;
Executor executor;
if (ExecutorType.BATCH == executorType) {
executor = new BatchExecutor(this, transaction);
} else if (ExecutorType.REUSE == executorType) {
executor = new ReuseExecutor(this, transaction);
} else {
executor = new SimpleExecutor(this, transaction);
}
if (cacheEnabled) {
executor = new CachingExecutor(executor);
}
executor = (Executor) interceptorChain.pluginAll(executor);
return executor;
}
, Mapper.xml cache, CachingExecutor , cache Mapper.xml cache。 cache , useCache() true , select useCache true, , , useCache false 。
@Override
public List query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql)
throws SQLException {
Cache cache = ms.getCache();
if (cache != null) {
flushCacheIfRequired(ms);
if (ms.isUseCache() && resultHandler == null) {
ensureNoOutParams(ms, parameterObject, boundSql);
@SuppressWarnings("unchecked")
List list = (List) tcm.getObject(cache, key);
if (list == null) {
list = delegate. query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
tcm.putObject(cache, key, list); // issue #578 and #116
}
return list;
}
}
return delegate. query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
}
8.2.2cache
, Mapper.xml cache 。 , cache , cache-ref 。 Mapper , Cache, 。Mapper Cache Mapper namespace , namespace Cache 。
8.2.2.1cache
cache Cache , Mapper.xml , Mybatis Cache , PerpetualCache , LruCache ( )。 XMLMapperBuilder cacheElement() cache 。 cache 1024 , , , , , 。
cache , Cache , 。
Ø blocking: false, true BlockingCache ,blocking, , BlockingCache Key, , , , BlockingCache 。
Ø eviction:eviction, 。 , LRU, LruCache, 1024 Key, , LruCache 。 , , Mybatis Cache 。 LRU , FIFO( , FifoCache)、SOFT( Value, , SoftCache) WEAK( Value, , WeakCache) 。
Ø flushInterval: , , 。 ScheduleCache , flushInterval , , , ScheduleCache 。
Ø readOnly: , false。 false , SerializedCache , , , , , , , , ; true , , , 。 Mybatis , 。 , , , 。 SerializedCache 。
Ø size: Key 。 LruCache ,LruCache 1024 Key, , , eviction , setSize , cache size size 。
Ø type:type , PerpetualCache, Cache, , Cache 。
8.2.2.2cache-ref
cache-ref Mapper.xml Cache, Mapper , MapperA MapperB , cache-ref, Key , Key Executor createCacheKey() , BaseExecutor, 。
public CacheKey createCacheKey(MappedStatement ms, Object parameterObject, RowBounds rowBounds, BoundSql boundSql) {
if (closed) {
throw new ExecutorException("Executor was closed.");
}
CacheKey cacheKey = new CacheKey();
cacheKey.update(ms.getId());
cacheKey.update(Integer.valueOf(rowBounds.getOffset()));
cacheKey.update(Integer.valueOf(rowBounds.getLimit()));
cacheKey.update(boundSql.getSql());
List parameterMappings = boundSql.getParameterMappings();
TypeHandlerRegistry typeHandlerRegistry = ms.getConfiguration().getTypeHandlerRegistry();
// mimic DefaultParameterHandler logic
for (int i = 0; i < parameterMappings.size(); i++) {
ParameterMapping parameterMapping = parameterMappings.get(i);
if (parameterMapping.getMode() != ParameterMode.OUT) {
Object value;
String propertyName = parameterMapping.getProperty();
if (boundSql.hasAdditionalParameter(propertyName)) {
value = boundSql.getAdditionalParameter(propertyName);
} else if (parameterObject == null) {
value = null;
} else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
value = parameterObject;
} else {
MetaObject metaObject = configuration.newMetaObject(parameterObject);
value = metaObject.getValue(propertyName);
}
cacheKey.update(value);
}
}
if (configuration.getEnvironment() != null) {
// issue #176
cacheKey.update(configuration.getEnvironment().getId());
}
return cacheKey;
}
PersonMapper.xml UserMapper.xml Cache, cache-ref namespace Cache namespace, UserMapper.xml namespace, UserMapper.xml namespace com.elim.learn.mybatis.dao.UserMapper, PersonMapper.xml cache-ref 。
8.2.3 cache
Mybatis Cache PerpetualCache , , , Ehcache、Redis , Cache ,Mybatis , 。 Cache Mybatis Cache , 。 , Cache String , Cache ID, Mybatis Cache , XMLMapperBuilder cacheElement() 。 MyCache 。
/**
* @author Elim
* 2016 12 20
*/
publicclass MyCache implements Cache {
private String id;
private String name;//Name, , Cache
private Map
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.