当前位置: 首页 > news >正文

英文网站设计多少钱手机电脑网站设计

英文网站设计多少钱,手机电脑网站设计,友情链接权重高的网站,建立企业网站的意义添加配置mybatis-plus.configuration.cache-enabledtrue在mapper.xml文件中添加cache标签<cache size"10240" eviction"LRU"/>同一个事务中二级缓存不生效&#xff0c;会使用一级缓存&#xff0c;因为事务未提交。 执行流程部分 Configuration创建…
  1. 添加配置
    mybatis-plus.configuration.cache-enabled=true
    
  2. 在mapper.xml文件中添加cache标签
    <cache size="10240" eviction="LRU"/>
    
  3. 同一个事务中二级缓存不生效,会使用一级缓存,因为事务未提交。
执行流程部分
  1. Configuration创建Executor对象
    public class Configuration{public Executor newExecutor(Transaction transaction, ExecutorType executorType) {executorType = executorType == null ? defaultExecutorType : executorType;Executor executor = new SimpleExecutor(this, transaction);// 根据settings中配置的启用cache创建CachingExecutor包装类if (cacheEnabled) {executor = new CachingExecutor(executor);}return (Executor) interceptorChain.pluginAll(executor);}
    }
    
  2. CachingExecutor#query查询逻辑
    public class CachingExecutor implements Executor {public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler,CacheKey key, BoundSql boundSql) throws SQLException {//1. 从 MappedStatement中获取二级缓存对象,如果存在,则进入缓存查询逻辑Cache cache = ms.getCache();if (cache != null) {flushCacheIfRequired(ms);if (ms.isUseCache() && resultHandler == null) {ensureNoOutParams(ms, boundSql);List<E> list = (List<E>) tcm.getObject(cache, key);if (list == null) {list = delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);//2. 将数据保存到缓存中,注意这里先放入TransactionalCache对象中,等待事务提交时回调CachingExecutor#commit时,// 调用TransactionalCache#commit -> 调用flushPendingEntries将缓存数据写入到cache中,// 所以同一个事务中多次查询无法使用二级缓存中的数据tcm.putObject(cache, key, list); // issue #578 and #116}return list;}}// 3. 非二级缓存逻辑return delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);}    
    }
    
  3. TransactionalCache#commit事务提交时回调逻辑
    public class TransactionalCache{// 事务体骄傲时回调函数 public void commit() {if (clearOnCommit) {delegate.clear();}flushPendingEntries();reset();}private void flushPendingEntries() {for (Map.Entry<Object, Object> entry : entriesToAddOnCommit.entrySet()) {// 将缓存数据写入到cache对象中 delegate.putObject(entry.getKey(), entry.getValue());}for (Object entry : entriesMissedInCache) {if (!entriesToAddOnCommit.containsKey(entry)) {delegate.putObject(entry, null);}}}
    }
    

解析注册部分

XMLMapperBuilder解析MapperStatement并放入到Configuration中
  1. XMLMapperBuilder#configurationElement业务逻辑处理
    public class XMLMapperBuilder{private void configurationElement(XNode context) {try {String namespace = context.getStringAttribute("namespace");if (namespace == null || namespace.isEmpty()) {throw new BuilderException("Mapper's namespace cannot be empty");}builderAssistant.setCurrentNamespace(namespace);cacheRefElement(context.evalNode("cache-ref"));// 1. 解析XXXMapper.xml文件中的cache标签,并调用builderAssistant.useNewCache构建Cache实例cacheElement(context.evalNode("cache"));parameterMapElement(context.evalNodes("/mapper/parameterMap"));resultMapElements(context.evalNodes("/mapper/resultMap"));sqlElement(context.evalNodes("/mapper/sql"));// 2. 构建Statement对象buildStatementFromContext(context.evalNodes("select|insert|update|delete"));} catch (Exception e) {throw new BuilderException("Error parsing Mapper XML. The XML location is '" + resource + "'. Cause: " + e, e);}}    private void buildStatementFromContext(List<XNode> list, String requiredDatabaseId) {for (XNode context : list) {final XMLStatementBuilder statementParser = new XMLStatementBuilder(configuration, builderAssistant, context, requiredDatabaseId);// 构建Statement对象statementParser.parseStatementNode();}}
    }
    
XMLMapperBuilder#cacheElement 展开细节
  1. MapperBuilderAssistant#useNewCache构建Cache实例并添加到Configuration中缓存
    public class MapperBuilderAssistant{public Cache useNewCache(Class<? extends Cache> typeClass, Class<? extends Cache> evictionClass, Long flushInterval,Integer size, boolean readWrite, boolean blocking, Properties props) {Cache cache = new CacheBuilder(currentNamespace).implementation(valueOrDefault(typeClass, PerpetualCache.class)).addDecorator(valueOrDefault(evictionClass, LruCache.class)).clearInterval(flushInterval).size(size).readWrite(readWrite).blocking(blocking).properties(props).build();configuration.addCache(cache);// 将cache实例赋值给MapperBuilderAssistant对象的 currentCache 属性currentCache = cache;return cache;}    
    }
    
XMLStatementBuilder#parseStatementNode 展开细节
  1. XMLStatementBuilder#parseStatementNode调用builderAssistant.addMappedStatement实例化MapperStatement对象
    public class XMLStatementBuilder extends BaseBuilder {public void parseStatementNode() {// 省略部分代码 builderAssistant.addMappedStatement(id, sqlSource, statementType, sqlCommandType, fetchSize, timeout, parameterMap,parameterTypeClass, resultMap, resultTypeClass, resultSetTypeEnum, flushCache, useCache, resultOrdered,keyGenerator, keyProperty, keyColumn, databaseId, langDriver, resultSets, dirtySelect);}
    }
    
  2. MapperBuilderAssistant#addMappedStatement
    public class MapperBuilderAssistant extends BaseBuilder {public MappedStatement addMappedStatement(String id, SqlSource sqlSource, StatementType statementType,SqlCommandType sqlCommandType, Integer fetchSize, Integer timeout, String parameterMap, Class<?> parameterType,String resultMap, Class<?> resultType, ResultSetType resultSetType, boolean flushCache, boolean useCache,boolean resultOrdered, KeyGenerator keyGenerator, String keyProperty, String keyColumn, String databaseId,LanguageDriver lang, String resultSets, boolean dirtySelect) {id = applyCurrentNamespace(id, false);MappedStatement.Builder statementBuilder = new MappedStatement.Builder(configuration, id, sqlSource, sqlCommandType).resource(resource).fetchSize(fetchSize).timeout(timeout).statementType(statementType).keyGenerator(keyGenerator).keyProperty(keyProperty).keyColumn(keyColumn).databaseId(databaseId).lang(lang).resultOrdered(resultOrdered).resultSets(resultSets).resultMaps(getStatementResultMaps(resultMap, resultType, id)).resultSetType(resultSetType).flushCacheRequired(flushCache).useCache(useCache)//1. 将MapperBuilderAssistant对象的 currentCache 属性放入到cache字段中.cache(currentCache).dirtySelect(dirtySelect);ParameterMap statementParameterMap = getStatementParameterMap(parameterMap, parameterType, id);if (statementParameterMap != null) {statementBuilder.parameterMap(statementParameterMap);}MappedStatement statement = statementBuilder.build();configuration.addMappedStatement(statement);return statement;}    
    }
    
http://www.yayakq.cn/news/81658/

相关文章:

  • 辽宁省建设厅网站中级职称公示设计9大软件
  • 网站建设挣钱么禄丰网站建设
  • html后缀的网站设计本装修app
  • 网站投票链接怎么做电子模板
  • 物流企业网站建设步骤中国来料加工网
  • 怎么制作手机网站个人养老金制度将推
  • 大连城市建设管理局网站1688官网入口
  • 南康家具网站建设微信 网站设计模板
  • 平面设计师素材网站买布自己做网站衣服的
  • 开普网站建设公司网站备案和icp备案
  • 政务网站建设经验做法公司做网站需要
  • 开发网站的经济可行性wordpress购物车免费
  • 广东网站定制nh网站建设
  • 简述建设一个商务网站的过程传播网站建设
  • 公司建设网站费用属于什么费用吗wordpress 获取文章id
  • 法拍房北京网站网站建设登录
  • 网站浏览器兼容js网页设计大作业源代码
  • 现在还有人用asp做网站创建空白网站
  • 做网站不难吧海外网站空间
  • 龙岗网站优化培训住建培训平台
  • dj网站模板免费下载东莞网站开发哪里找
  • 网站建设seo 视频教程代做百度关键词排名
  • 苏州北京网站建设织梦网站会员中心模板
  • 做高端网站建设公司母婴的网站建设
  • 上海网站怎么备案表文网站建设
  • 北郊网站建设做网站 除了域名
  • 全景旅游网站建设ppt做杂志模板下载网站
  • php网站开发难吗杭州哪家公司做网站比较好
  • 揭阳东莞网站建设一个女的让我和她做优惠网站
  • 做食品网站用什么颜色做网站 工资高吗