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

旅游商业网站策划书做网站公司(信科网络)

旅游商业网站策划书,做网站公司(信科网络),wordpress加上特效,影响网站加载速度2.4Mybatis——缓存机制 缓存配置一二级缓存一级缓存二级缓存 合集总览:Mybatis框架梳理 讲真,Mybatis缓存这块的记忆已经模糊了。刚好此时写测试用例出现一个BUG,就以这个问题作为切入点来梳理一下。 Testpublic void test(){Address ad…

2.4Mybatis——缓存机制

  • 缓存配置
  • 一二级缓存
    • 一级缓存
    • 二级缓存

合集总览:Mybatis框架梳理   


讲真,Mybatis缓存这块的记忆已经模糊了。刚好此时写测试用例出现一个BUG,就以这个问题作为切入点来梳理一下。

@Testpublic void test(){Address address = addressMapper.selectById(1L);System.out.println(address);System.out.println("==========================");address = addressMapper.selectById(1L);System.out.println(address);}

问题描述:未进行任何缓存配置,以为会缓存第一次查询结果,但这里控制台打印了两次SQL查。,没有按照预期走Mybatis的缓存策略,分析一下问题出在哪里

缓存配置

官方文档永远是查找问题的首选。关于缓存的介绍,是这样说的:

  1. cacheEnabled 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存,默认为true”

  2. “默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行<cache/>"

总结就是:

  1. 可以全局配置Mybatis的缓存开关,默认开启;
  2. 默认情况下,缓存只在一个sqlSession中生效(即一级缓存开启),同一mapper下(二级缓存)需要手动打开。

所以我们的BUG,如何想让其只执行一次查询,有两种调整方式:

  1. 在AddressMapper.xml中添加<cache/>标签
  2. 两次查询使用同一个sqlSession连接
// 1.使用cache标签
<mapper namespace="org.wyy.mapper.AddressMapper"><cache/><select id="selectById" resultType="org.wyy.dto.Address">select * from address where id = #{id}</select>
</mapper>// 2.使用一个sqlSession连接
@Test
public void test1(){SqlSession sqlSession = sqlSessionFactory.openSession();AddressMapper addressMapper = sqlSession.getMapper(AddressMapper.class);System.out.println(addressMapper.selectById(1L));System.out.println(addressMapper.selectById(1L));sqlSession.close();}

一二级缓存

使用第二种方法正常执行,但使用第一种方法时,提示序列化异常:Cause: java.io.NotSerializableException: org.wyy.dto.Address
这又是什么原因呢?

一级缓存

根据前面几篇文章的描述,我们知道mapper方法的执行分为SQL的映射和SQL的执行,执行阶段又分为执行器构建、statement构建、参数处理、SQL语句执行、结果集处理这几个阶段。
以查询为例,缓存肯定是在执行阶段将查询和结果缓存起来。看一下源码:

@Override
public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {BoundSql boundSql = ms.getBoundSql(parameterObject);// 构建缓存键CacheKey key = createCacheKey(ms, parameterObject, rowBounds, boundSql);return query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
}public <E> List<E> query(...){// 从本地缓存中获取, localCache是PerpetualCache类型list = resultHandler == null ? (List<E>) localCache.getObject(key) : null;
}public class PerpetualCache implements Cache {private final String id;private Map<Object, Object> cache = new HashMap<>();
}

一级缓存本质是使用Map进行保存,不涉及序列化操作,所以测试中正常执行。

二级缓存

Mybatis默认使用SerializedCache作为二级缓存,由于二级缓存存在持久化和跨会话共享等场景的要求,为了保证缓存对象的完整,被缓存的对象必须实现序列化接口。
除了使用Mybatis默认的二级缓存实现,如果想要自定义二级缓存,只需要实现Mybatis的Cache接口即可,比如通过集成Ehcache或redis来作为Mybatis的缓存实现。

<dependency><groupId>org.mybatis.caches</groupId><artifactId>mybatis-ehcache</artifactId><version>1.2.2</version>
</dependency>
<dependency><groupId>org.mybatis.caches</groupId><artifactId>mybatis-redis</artifactId><version>1.0.0-beta2</version>
</dependency>

所以,Mybatis的缓存设计中,对于仅作用于一次数据库连接内的缓存,使用的是Map集合工具。
对于需要跨线程、跨进程共享的缓存,则是将其存放在JVM实例之外与系统解耦。Mybatis不再关心接入的二级缓存的实现细节,只需实现Cache接口即可。
对于二级缓存而言,官方文档还提供了缓存的容量、驱逐策略等配置属性,感兴趣可以继续探究。

http://www.15wanjia.com/news/178816.html

相关文章:

  • 会网站开发维护的ps什么岗位珠海电商网站建设
  • 页面设计网站素材wordpress如何添加模板
  • o2o网站建设公司排名wordpress 4.5.6
  • 宁波有没有开发网站的公司新浪微博指数查询
  • 视频教学网站怎么做竞价推广代运营公司
  • 临湘市建设局网站如何在手机上做广告
  • 公司做网站怎么做账网站本地环境搭建软件
  • 新网网站空间到期停了 咋续费中国兰州网pc主站
  • 本溪市做网站公司网站搜索排名高怎么做
  • 展馆展示设计公司招聘广告企业网站建设 优化
  • 宁夏建设投资集团公司网站娱乐网站后缀是什么
  • 公司logo免费智能设计如何seo推广
  • 用jsp进行网站开发公司网站 免费模板
  • 查看注册过的网站wordpress+mo主题
  • 饮食网站开发需求做301网站打不开
  • 网站建设维护合同芝罘区网
  • 怎么建立企业网站平台中国商标网官方查询系统
  • 建设视频网站设计意义佛山seo管理
  • 网站的优化分析做原创短视频网站
  • 17网一起做网店普宁站做网站都要买出口带宽吗
  • 手机建站源码烟台企业网站怎么优化
  • 简约中文网站设计欣赏网站导航的作用
  • 如何修改dns 快速使用境外网站深圳招聘网络推广
  • 网站制作方法公司网站建设实施方案
  • 亚马逊的网站建设分析呼市做网站
  • 青岛做网站推广公司哪家好山东一建建设有限公司网站
  • 怎么做化妆品网站内容规划网站建站建设网站
  • 中山网站建设哪家好阿里云clouder网站建设
  • spring mvc 网站开发给人建设网站能赚钱吗
  • 网站后期推广是谁来做莱州网站建设关键字排名优化网络托管微信代运营