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

西宁网站建设价格百度hi

西宁网站建设价格,百度hi,山东查询网站备案,网站更换图片之类的怎么做文章目录一级缓存二级缓存总结对于一名程序员#xff0c;缓存真的很重要#xff0c;而且缓存真的是老生常谈的一个话题拉。因为它在我们的开发过程中真的是无处不在。今天LZ带大家来看一下。Mybatis是怎么实现一级缓存和二级缓存的。(自带的缓存机制)一级缓存 存在BaseExecu… 文章目录一级缓存二级缓存总结对于一名程序员缓存真的很重要而且缓存真的是老生常谈的一个话题拉。因为它在我们的开发过程中真的是无处不在。今天LZ带大家来看一下。Mybatis是怎么实现一级缓存和二级缓存的。(自带的缓存机制)一级缓存 存在BaseExecutor中是全局的缓存每次查询后将值存入BaseExecutor的localCache中。key是由ms,parameter,rowBounds和boundSql一起生成的一个值。value就是查询出来的结果。一旦有任何更新变动就删除整个localCache。 Override//生成一级缓存的key的函数有兴趣的看看LZ不详细解释了不是重点。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(rowBounds.getOffset());cacheKey.update(rowBounds.getLimit());cacheKey.update(boundSql.getSql());ListParameterMapping parameterMappings boundSql.getParameterMappings();TypeHandlerRegistry typeHandlerRegistry ms.getConfiguration().getTypeHandlerRegistry();// mimic DefaultParameterHandler logicfor (ParameterMapping parameterMapping : parameterMappings) {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 #176cacheKey.update(configuration.getEnvironment().getId());}return cacheKey;} //查询数据库并存入一级缓存的语句private E ListE queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {ListE list;//先放一个值占位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) {//如果是存储过程把参数存入localOutputParameterCachelocalOutputParameterCache.putObject(key, parameter);}return list;}Override//更新变动等语句删除缓存public int update(MappedStatement ms, Object parameter) throws SQLException {ErrorContext.instance().resource(ms.getResource()).activity(executing an update).object(ms.getId());if (closed) {throw new ExecutorException(Executor was closed.);}//删除一级缓存clearLocalCache();//执行语句return doUpdate(ms, parameter);}Override//删除一级缓存public void clearLocalCache() {if (!closed) {localCache.clear();localOutputParameterCache.clear();}}所以一级缓存的作用级别是SESSION级别的因为一个session中存放一个Executor。而一级缓存放在Executor。 二级缓存 如果开启了二级缓存的话你的Executor将会被装饰成CachingExecutor二级缓存是MapperStatement级的缓存也就是一个namespace就会有一个缓存缓存是通过CachingExecutor来操作的。查询出来的结果会存在statement中的cache中若有更新删除类的操作默认就会清空该MapperStatement的cache也可以通过修改xml中的属性让它不执行不会影响其他的MapperStatement Overridepublic E ListE query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql)throws SQLException {//获得该MappedStatement的cacheCache cache ms.getCache();if (cache ! null) {//看是否需要清除cache在xml中可以配置flushCache属性决定何时清空cacheflushCacheIfRequired(ms);if (ms.isUseCache() resultHandler null) {//若开启了cache且resultHandler 为空ensureNoOutParams(ms, parameterObject, boundSql);SuppressWarnings(unchecked)//从TransactionalCacheManager中取cacheListE list (ListE) tcm.getObject(cache, key);//若没值if (list null) {//访问数据库list delegate.E query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);//存入cachetcm.putObject(cache, key, list); // issue #578 and #116}return list;}}return delegate.E query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);}Overridepublic int update(MappedStatement ms, Object parameterObject) throws SQLException {//看是否需要清除cache在xml中可以配置flushCache属性决定何时清空cacheflushCacheIfRequired(ms);return delegate.update(ms, parameterObject);}private void flushCacheIfRequired(MappedStatement ms) {//获得cacheCache cache ms.getCache();if (cache ! null ms.isFlushCacheRequired()) { //若需要清除则清除cachetcm.clear(cache);}}因同一个namespace下的MappedStatement的cache是同一个而TransactionalCacheManager中统一管理cache是里面的属性transactionalCaches,该属性以MappedStatement中的Cache为keyTransactionalCache对象为Value。即一个namespace对应一个TransactionalCache。 public class TransactionalCacheManager {private MapCache, TransactionalCache transactionalCaches new HashMapCache, TransactionalCache();…… } public class TransactionalCache implements Cache {private static final Log log LogFactory.getLog(TransactionalCache.class);//就是对应的namespace中的cacheprivate Cache delegate;//提交的时候清除cache的标志位private boolean clearOnCommit;//待提交的集合private MapObject, Object entriesToAddOnCommit;//未查到的key存放的集合private SetObject entriesMissedInCache; }总结 一级缓存是sqlSession级别的缓存存放在BaseExecutor中的localCache中。查询就将结果缓存进去一旦有更新删除插入类的操作就清空缓存。不同的sqlSession之间的缓存是互相不影响的。 二级缓存是namespace级别的可以理解为一个mapper.xml文件对应一个二级缓存不同的sqlSession之间的缓存是共享的然后对缓存的操作是在.xml文件中的标签文件进行控制的。比如下面的代码 ?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacemapper.TDemoMapper !-- 一个namespace对应一个缓存 --resultMap idbaseMap typeentity.TDemoresult propertyid columnid jdbcTypeINTEGER/resultresult propertyname columnname jdbcTypeVARCHAR/result/resultMap!-- 执行此语句不清空缓存 --select idgetAll resultTypeentity.TDemo useCachetrue flushCachefalse select * from t_demo/select/mapper
http://wiki.neutronadmin.com/news/242277/

相关文章:

  • 淘宝做网站的都是模板万城建设网站
  • 网站开发获取用户微信号登录做商城外贸网站
  • 如何通过网站后台修改网站电商网站设计规范
  • 管理网站 开发黔西南做网站的有几家
  • 浙江省建设厅 网站是多少怎么看网站开发的发展
  • 网站备案时间也太慢了百度云搜索引擎入口百度网盘
  • 阿里云有主体新增网站简历网站有哪些
  • 用js做网站登录北京数据优化公司
  • 贵阳网站建设三思网络长春建设网站公司哪家好
  • 学信网 的企业网站给你做认证湘阴网站建设
  • 织梦做有网站有后台 能下载备份所有代码文件么哪个网站企业邮箱最好
  • 做头像的网站空白桂林人才网
  • 如何建视频网站软文代写是什么
  • 行知智网站开发精准广告投放
  • 自己做的微课上传到哪个网站专业的临沂网站优化
  • 企业一站式网站建设做免费网站教程国vs
  • 自己做服务器的网站吗xml网站地图每天更新
  • 做网站怎么字体全部变粗了设计培训班大概多少钱
  • 网站开发如何让图片加载的更快福田做棋牌网站建设找哪家效益快
  • 织梦网站如何做伪静态wordpress增加内存
  • 杭州模板网站wordpress视频大小自由适配屏幕
  • 佛山网站建设公司排行丹东有做公司网站的吗
  • 曹县商城网站建设云主机添加网站
  • 中英文的网站怎么建设中山网站建设 骏域
  • 北京网站排名优化软件wordpress主题 游戏
  • 什么是网页和网站要压实互联网企业的什么责任
  • 如何做网络集资网站wordpress 分类图片尺寸
  • seo网站推广价格模板网站购买
  • 网站使用微信支付做网站用什么语音
  • 建设的网站打开速度很慢十大营销咨询公司