public Object executeQueryForObject(RequestScope request, Transaction trans, Object parameterObject, Object resultObject)
throws SQLException
{
CacheKey cacheKey = getCacheKey(request, parameterObject);
cacheKey.update("executeQueryForObject");
Object object = cacheModel.getObject(cacheKey);
if(object == CacheModel.NULL_OBJECT)
object = null;
else
if(object == null)
{
object = statement.executeQueryForObject(request, trans, parameterObject, resultObject);
cacheModel.putObject(cacheKey, object);
}
return object;
}
ibatis的配置文件里面有一个cache项:
sqlMapConfig >
< settings
cacheModelsEnabled ="true"
enhancementEnabled ="true"
lazyLoadingEnabled ="true"
errorTracingEnabled ="true"
maxRequests ="32"
maxSessions ="10"
maxTransactions ="5"
useStatementNamespaces ="false"
/>
cacheModelsEnabled 设置了ibatis在进行查询时是不是要进行缓存,如果设置了,那么在查询时先到缓存中查询,如果缓存中没有,那么就到数据库查询,并且把查询结果存储到缓存里面。
ibatis里面的jdbc操作最终是由SqlMapExecutorDelegate类执行的,比如查询
:
public Object queryForObject(SessionScope session, String id, Object paramObject, Object resultObject)
throws SQLException
{
Object object;
MappedStatement ms;
Transaction trans;
boolean autoStart;
object = null;
ms = getMappedStatement(id);
trans = getTransaction(session);
autoStart = trans == null;
RequestScope request;
trans = autoStartTransaction(session, autoStart, trans);
request = popRequest(session, ms);
object = ms.executeQueryForObject(request, trans, paramObject, resultObject);
pushRequest(request);
break MISSING_BLOCK_LABEL_85;
Exception exception;
exception;
pushRequest(request);
throw exception;
autoCommitTransaction(session, autoStart);
autoEndTransaction(session, autoStart);
break MISSING_BLOCK_LABEL_114;
Exception exception1;
exception1;
autoEndTransaction(session, autoStart);
throw exception1;
return object;
}
如果在配置文嘉里面设置了缓存,那么这时候会使用一个CachingStatement:
public Object executeQueryForObject(RequestScope request, Transaction trans, Object parameterObject, Object resultObject)
throws SQLException
{
CacheKey cacheKey = getCacheKey(request, parameterObject);
cacheKey.update("executeQueryForObject");
Object object = cacheModel.getObject(cacheKey);
if(object == CacheModel.NULL_OBJECT)
object = null;
else
if(object == null)
{
object = statement.executeQueryForObject(request, trans, parameterObject, resultObject);
cacheModel.putObject(cacheKey, object);
}
return object;
}
其中的CashModel是一个线程安全的类。用来根据key取得缓存的对象。