• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > mybatis中的缓存问题解析

mybatis中的缓存问题解析

作者:_江南一点雨 字体:[增加 减小] 来源:互联网 时间:2017-05-28

_江南一点雨 通过本文主要向大家介绍了mybatis二级缓存,mybatis三级缓存,mybatis一级缓存,mybatis缓存,mybatis缓存机制等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

关于mybatis基础我们前面几篇博客已经介绍了很多了,今天我们来说一个简单的问题,那就是mybatis中的缓存问题。mybatis本身对缓存提供了支持,但是如果我们没有进行任何配置,那么默认情况下系统只开启了一级缓存,一级缓存就是同一个SqlSession执行的相同查询是会进行缓存的,OK,那么今天我们就来看看这些缓存,并简单验证下。

系统默认开启了一级缓存

这个缓存系统默认情况下是开启的,当我们获取到一个SqlSession对象之后,如果调用SqlSession中的同一个方法查询同一条数据,那么第二次查询将不会去数据库中查询,因为第一次查询有缓存,直接调用缓存数据即可,除非缓存超时或者我们明确声明数据要刷新,否则都是直接调用缓存数据。OK,我们来看一个简单的案例。
查询代码如下:

SqlSession sqlSession = null;
    try {
      sqlSession = DBUtils.openSqlSession();
      UserMapper mapper = sqlSession.getMapper(UserMapper.class);
      //查询同一条数据时会缓存
      User user = mapper.getUser(1l);
      User user2 = mapper.getUser(1l);
      System.out.println(user.toString());
      System.out.println(user2.toString());
      sqlSession.commit();
    } catch (Exception e) {
      System.err.println(e.getMessage());
      sqlSession.rollback();
    } finally {
      if (sqlSession != null) {
        sqlSession.close();
      }
    }
</div>

我们来看看日志:

这里写图片描述 

小伙伴们看到,我这里执行了两次查询,但实际上只执行了一次SQL语句。

自己配置二级缓存

上面的缓存是由系统默认配置的,这个有一定的局限性,就是只能在同一个SqlSession中有效,脱离了同一个SqlSession就没法使用这个缓存了,有的时候我们可能希望能够跨SqlSession进行数据缓存。那么这个时候需要我们进行手动开启二级缓存。

二级缓存的开启方式其实很简单,只需要我们在userMapper.xml中配置<cache/>节点即可。如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.sang.db.UserMapper">
  <cache/>
  <select id="getUser" resultType="org.sang.bean.User" parameterType="Long">
    select * from user where id = #{id}
  </select>
  <insert id="insertUser" parameterType="org.sang.bean.User">
    INSERT INTO user(username,password,address) VALUES (#{username},#{password},#{address})
  </insert>
  <delete id="deleteUser" parameterType="Long">
    DELETE FROM user where id=#{id}
  </delete>
  <select id="getAll" resultType="u">
    SELECT * from user
  </select>
</mapper>

</div>

这样简单配置之后,二级缓存就算开启了,这样的配置中,许多东西都是默认的,比如所有的select语句都会被缓存,所有的delete、insert和update则都会将缓存刷新,还比如缓存将使用LRU算法进行内存回收等。那么这些东西如果需要配置的话,我们可以按如下方式进行配置:

<cache eviction="LRU" flushInterval="20000" size="1024" readOnly="true"/>,这里的eviction表示缓存策略,除了LRU之外还有先进先出(FIFO)、软引用(SOFT)、弱引用(WEAK)等,flushInterval则表示刷新时间,表示缓存的对象个数,readOnly为true则表示缓存只可以读取不可以修改。

OK,做了如上配置之后还不够,开启二级缓存还要求我们的实体类可以序列化,实现Serializable接口即可,如下:

public class User implements Serializable{
  private Long id;
  private String username;
  private String password;
  private String address;

  ...

}

</div>

如此之后,我们的二级缓存就算成功开启了,OK,我么来测试下:

SqlSession sqlSession = null;
    SqlSession sqlSession2 = null;
    try {
      sqlSession = DBUtils.openSqlSession();
      UserMapper mapper = sqlSession.getMapper(UserMapper.class);
      User user = mapper.getUser(1l);
      System.out.println(user.toString());
      sqlSession.commit();
      sqlSession2 = DBUtils.openSqlSession();
      UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
      User user2 = mapper2.getUser(1l);
      System.out.println(user2.toString());
      sqlSession2.commit();
    } catch (Exception e) {
      System.err.println(e.getMessage());
      sqlSession.rollback();
      sqlSession2.rollback();
    } finally {
      if (sqlSession != null) {
        sqlSession.close();
      }
      if (sqlSession2 != null) {
        sqlSession2.close();
      }
    }

</div>

打印日志如下:

这里写图片描述 

OK,小伙伴们看到SQL语句实际上只执行了一次。

OK,以上就是对mybatis中缓存的一个简单介绍。

本文案例下载: 本文案例GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test27-mybatis8

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解Mybatis的二级缓存配置
  • mybatis中的缓存问题解析
  • MyBatis关于二级缓存问题
  • 详解Mybatis的二级缓存配置
  • mybatis中的缓存问题解析

相关文章

  • 2017-05-28Java设计模式之单例模式详解
  • 2017-05-28java自带命令行工具jmap、jhat与jinfo的使用实例代码详解
  • 2017-05-28java WSDL接口webService实现方式
  • 2017-05-28Java汉字转成汉语拼音工具类
  • 2017-05-28Spring boot 默认静态资源路径与手动配置访问路径的方法
  • 2017-05-28Java微信二次开发(三) Java微信各类型消息封装
  • 2017-05-28Java Calendar类的详解及使用实例
  • 2017-05-28Spring boot实现一个简单的ioc(2)
  • 2017-05-28浅谈JSP与Servlet传值及对比(总结)
  • 2017-05-28Spring基于注解整合Redis完整实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 详解使用JavaCV/OpenCV抓取并存储摄像头图像
    • 详解Redis 缓存 + Spring 的集成示例
    • Spring MVC登录注册以及转换json数据
    • Spring Boot无缝集成MongoDB
    • java中 String和StringBuffer的区别实例详解
    • Spring Boot的filter(过滤器)简单使用实例详解
    • webuploader在springMVC+jquery+Java开发环境下的大文件分片上传的实例代码
    • Java数据结构之数组(动力节点之Java学院整理)
    • java 整型数与Integer的缓存深入理解
    • 详解利用Spring的AbstractRoutingDataSource解决多数据源的问题

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有