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

昆山建设监察网站旅游搜索量环比增188%

昆山建设监察网站,旅游搜索量环比增188%,无锡在线制作网站,保护稀有动物网站建设策划书如图所示: Mybatis的缓存如图所示: 当数据没有改变,开启SQLsession使用SQL语句对数据进行一次查询时,会将数据进行缓存,当第二次查询同样的数据时,则命中缓存,不去查询数据库,加快…

如图所示:

Mybatis的缓存如图所示:

当数据没有改变,开启SQLsession使用SQL语句对数据进行一次查询时,会将数据进行缓存,当第二次查询同样的数据时,则命中缓存,不去查询数据库,加快查询耗时;

特点:

一级缓存、二级缓存都是基于本地缓存的一个名为PerpetualCache,它本质是一个Hashmap

一级缓存作用域是session级别,同一个session,调同一个SQL会进行缓存,默认是打开的

二级缓存作用域更广,是namespace和mapper的作用域,只要是同一个namespace或者查询同一个mapper文件(同一张表)的SQL,都会进行缓存,不依赖session,但是默认是关闭的;

一、一级缓存

1、基于一个session

基于perpetualCache的HashMap本地缓存,其作用域为Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存

// 获取一个sqlsession,用它来执行SQL
Sqlsession sqlsession = sqlSessionFactory.openSession();// 执行SQL,用同一个session对象获取两次,同一笔数据,
// 得到userMapper1、userMapper2两个代理对象
UserMapper userMapper1 = sqlsession.getMapper(UserMapper.class);
UserMapper userMapper1 = sqlsession.getMapper(UserMapper.class);// 用这两个代理对象,执行两次查询SQL,但是到数据库层面只会进行一次查询
User user = userMapper1.selectById(6);
System.out.prientln(user);System.out.prientln("--------------------------");
User user1 = userMapper2.selectById(6);
System.out.prientln(user1);

控制台结果如下:

我们可以看到,明明调用了两次select语句,但是实际上只查询了一次数据库,证明后面一次直接走的是缓存,这就是一级缓存

因为他们用的是同一个session,走了一级缓存,用两个session就会查询两次数据库了

2、基于两个session

// 获取一个sqlsession,用它来执行SQL
Sqlsession sqlsession1 = sqlSessionFactory.openSession();// 执行SQL,用同一个session对象获取两次,同一笔数据,
// 得到userMapper1代理对象
UserMapper userMapper1 = sqlsession1.getMapper(UserMapper.class);// 用这两个代理对象,执行两次查询SQL,但是到数据库层面只会进行一次查询
User user = userMapper1.selectById(6);
System.out.prientln(user);
sqlsession1.close();// 另外开启一个session
Sqlsession sqlsession2 = sqlSessionFactory.openSession();System.out.prientln("--------------------------");
UserMapper userMapper2 = sqlsession2.getMapper(UserMapper.class);
User user2 = userMapper2.selectById(6);
System.out.prientln(user2);sqlsession2.close();

控制台结果如下:

可以看到,以及缓存失效了,查询了两次数据库;

另外:当数据有过增删改等操作后,缓存就会失效,也会查两次数据库

那如果我两个session,也想使用Mybatis的缓存,可以不可以呢?

可以的,那就需要使用二级缓存了:

二、二级缓存

二级缓存也是基于perpetualCache的HashMap本地缓存,其作用域是namespace和mapper;而不是依赖于SQL session,所以范围更广

当两个session不能缓存时,我们可以手动配置开启二级缓存,使不同的session也能缓存:

开启方式,两步:

1、全局配置文件:

<settings><setting name='cacheEnabled" value='true'
</settings>

2、mapper映射文件中:

使用<cache/>标签让当前mapper文件生效二级缓存

我们测试一下,还是上面那个一级缓存失效的例子:

// 获取一个sqlsession,用它来执行SQL
Sqlsession sqlsession1 = sqlSessionFactory.openSession();// 执行SQL,用同一个session对象获取两次,同一笔数据,
// 得到userMapper1代理对象
UserMapper userMapper1 = sqlsession1.getMapper(UserMapper.class);// 用这两个代理对象,执行两次查询SQL,但是到数据库层面只会进行一次查询
User user = userMapper1.selectById(6);
System.out.prientln(user);
sqlsession1.close();// 另外开启一个session
Sqlsession sqlsession2 = sqlSessionFactory.openSession();System.out.prientln("--------------------------");
UserMapper userMapper2 = sqlsession2.getMapper(UserMapper.class);
User user2 = userMapper2.selectById(6);
System.out.prientln(user2);sqlsession2.close();

控制台结果如下:

手动二级缓存后,缓存生效

注意事项:

1、对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存namespace)的数据,进行了新增、修改、删除操作后,默认该作用域下的所有select中的缓存将被清除clear

2、二级缓存需要缓存中的数据,实现Serializable接口

3、只有会话提交或者关闭后,一级缓存中的数据才会转移到二级缓存中

http://www.dtcms.com/wzjs/61516.html

相关文章:

  • 手机版网站推荐建设网站的十个步骤
  • 网站建设方案可以乱写吗推广公众号的9种方法
  • 选择做印象绍兴网站的原因关键词优化快排
  • 网站 只做程序员b站免费建网站
  • 微页制作网站模板免费下载seo免费浏览网站
  • 购物商城网站建设流程北京百度推广电话
  • 做网站怎样申请动态域名优化什么
  • 网站开发就业前景网站管理系统
  • 一般网站建设公司新手seo要学多久
  • 做企业网站哪家强新网域名查询
  • 顺德o2o网站建设电商网站有哪些
  • 描述网站建设规范方法湖南专业关键词优化服务水平
  • 防城港网站开发手机怎么建立网站
  • 网站备案信息真实性核验单怎么弄宁波网站优化公司价格
  • 网页制作与网站建设实战大全 pdf东莞今天的最新通知
  • 重庆市建设工程seo引擎优化工具
  • 黑龙江做网站的公司有哪些企业seo的措施有哪些
  • ps做网站页面网站seo快速优化技巧
  • 网站实名认证功能怎么做友链交换
  • 做网站柳州福鼎网站优化公司
  • 淄博学校网站建设公司全国防疫大数据平台
  • 有没有做图的网站sem搜索引擎营销
  • 常州做网站麦策电商查销售数据的网站
  • 做淘客网站需要营业执照吗简单免费制作手机网站
  • 交互设计就业前景南宁seo网络推广
  • 一个做任务赚钱的网站网络营销和直播电商专业学什么
  • wordpress评论跳过验证北京百度搜索优化
  • 创世网站建设 优帮云sem投放
  • 做一个营销网站潮州seo
  • 四川企业网站开发网络营销公司全网推广公司