Mybatis强制查询缓存问题

1、对于经常用Mybatis框架的开发人员来说,都知道Mybatis进行数据库查询时的一个特性:

Mybatis连续执行两次相同的查询,Mybatis是不会去数据库中查询,而是直接从sqlsession中取,返回的对象也是同一个对象。简单来说就是不会再发出sql查询而是使用缓存的数据。这对于经常使用查询的系统无疑是一个非常好的特性,对于大量数据查询来说就是节约大量资源,降低开发成本。

但是我们有时候有特殊需要,那些数据一定要进行查询再能得到的,否则就会得到数据不一致的情况,这时候我们如何处理?

2、解决方案:

若是想要每次查询都返回新的对象,只需在xml文件select标签里添加属性 flushCache="true"。

3、MyBatis的缓存机制(分为一级缓存和二级缓存)

3.1一级缓存:

MyBatis的一级缓存指的是在一个Session域内,session为关闭的时候执行的查询会根据SQL为key,数据为value被缓存。

1)单独使用MyBatis而不继承Spring,使用原生的MyBatis的SqlSessionFactory来构造sqlSession查询,是可以使用以及缓存的,示例代码如下

public class Test {public static void main(String[] args) throws IOException {String config = "mybatis-config.xml";InputStream is = Resources.getResourceAsStream(config);SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);SqlSession session = factory.openSession();System.out.println(session.selectOne("selectUserByID", 1));// 同一个session的相同sql查询,将会使用一级缓存 System.out.println(session.selectOne("selectUserByID", 1));// 参数改变,需要重新查询System.out.println(session.selectOne("selectUserByID", 2));// 清空缓存后需要重新查询session.clearCache();System.out.println(session.selectOne("selectUserByID", 1));// session close以后,仍然使用同一个db connectionsession.close();session = factory.openSession();System.out.println(session.selectOne("selectUserByID", 1));}
}

当参数不变的时候只进行了一次查询,参数变更以后,则需要重新进行查询,而清空缓存以后,参数相同的查询过的SQL也需要重新查询。
2) 和Spring集成的时候

@Repository
public class UserDao extends SqlSessionDaoSupport {public User selectUserById(int id) {SqlSession session = getSqlSession();session.selectOne("dao.userdao.selectUserByID", id);// 由于session的实现是SqlSessionTemplate的动态代理实现// 它已经在代理类内执行了session.close(),所以无需手动关闭sessionreturn session.selectOne("dao.userdao.selectUserByID", id);}
}

这里执行了2次sql查询,看似我们使用了同一个sqlSession,但是实际上因为我们的dao继承了SqlSessionDaoSupport,而SqlSessionDaoSupport内部sqlSession的实现是使用用动态代理实现的,这个动态代理sqlSessionProxy使用一个模板方法封装了select()等操作,每一次select()查询都会自动先执行openSession(),执行完close()以后调用close()方法,相当于生成了一个新的session实例,所以 我们无需手动的去关闭这个session(),当然也无法使用mybatis的一级缓存,也就是说mybatis的一级缓存在spring中是没有作用的。

3.2二级缓存

二级缓存就是global caching,它超出session范围之外,可以被所有sqlSession共享,它的实现机制和mysql的缓存一样,开启它只需要在mybatis的配置文件开启settings里的。

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

以及在相应的Mapper文件里开启。

<mapper namespace="dao.userdao">...  select statement ...<!-- Cache 配置 --><cacheeviction="FIFO"flushInterval="60000"size="512"readOnly="true" />
</mapper>

需要注意的是global caching的作用域是针对Mapper的Namespace而言的,也就是说只在有在这个Namespace内的查询才能共享这个cache。

每天努力一点,每天都在进步。

Mybatis强制查询问题相关推荐

  1. MyBatis关联查询、多条件查询

    MyBatis关联查询.多条件查询 1.一对一查询 任务需求; 根据班级的信息查询出教师的相关信息 1.数据库表的设计 班级表: 教师表: 2.实体类的设计 班级表: public class Cla ...

  2. Mybatis联合查询

    为什么80%的码农都做不了架构师?>>>    案例 一个博客系统中,用户可以任意发表博文(Post),用户还可以对博文进行评论(Comment).于是在这个系统中,存在以下的关系: ...

  3. Mybatis like查询的写法--转载

    原文地址:http://lavasoft.blog.51cto.com/62575/1386870 Mybatis like查询官方文档没有明确的例子可循,网上搜索了很多,都不正确. Mybatis ...

  4. association 实现MyBatis分步查询与延迟加载

    一.分步查询 1.1什么时候可以用到分步查询 有的时候需要我们对数据库进行关联查询,比如Employee 持有另一个Department对象的一个引用,我们希望在查询Employee 的时候把Depa ...

  5. MyBatis基础:MyBatis关联查询(4)

    1. MyBatis关联查询简介 MyBatis中级联分为3中:association.collection及discriminator. ◊ association:一对一关联 ◊ collecti ...

  6. mybatis嵌套查询和嵌套结果有什么区别_Java面试专题之九:Mybatis面试5个大概率被问到的问题...

    1.为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里? Hibernate 属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关联集合对象时,可以根据 ...

  7. MyBatis之查询缓存

    MyBatis之查询缓存 2017/09/30 正如大多数持久层框架一样,MyBatis同样也提供了对查询数据的缓存支持.今后我们要学习的SpringMVC框架属于系统控制层,它也有它的缓存区域,对响 ...

  8. Mybatis in查询List或数组 场景实例

    1.mybatis in 查询List时 业务代码示例如下: List<String> list=new ArrayList<String>(); ...;//向list中填装 ...

  9. mybatis 取查询值_MyBatis面试题集合,90%会遇到这些问题

    点击蓝字关注我们吧! 1.#{}和${}的区别是什么? ${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com. ...

最新文章

  1. F5负载均衡的双机冗余配置与全冗余解析
  2. win7下安装linux(centos6.5)双系统详细小白教程
  3. 设计模式实战 - 责任链模式
  4. 添加RichEdit控件导致MFC对话框程序无法执行的解决方法
  5. 物理、线性、虚拟、逻辑、有效地址
  6. 云计算将为移动医疗带来哪些新机遇?
  7. React Native使用指南-使用链接库
  8. zookeeper中展示所有节点_分布式协调服务之Zookeeper
  9. 中国计算机学会第七届全国Web信息系统及其应用学术会议(WISA2010)征文通知
  10. SCOM2012功能测试(18)—对象发现(替代)
  11. 凭什么说这门编程语言是下一代 Java?
  12. win11如何查看下载速度 Windows11查看下载速度的方法介绍
  13. mysql错误诊断_MySQL Server无法启动错误诊断一则
  14. 基于DEV控件库的webservice打印.repx模板
  15. Kali-简易的Linux系统Dos网站压力测试(攻击)
  16. 电脑能正常上网上网,某些软件不能上网
  17. java int类型 BigDecimal类型转成汉字金额大写
  18. obs多推流地址_OBS下载、安装、使用(腾讯)推流直播教程
  19. maven 光速入门攻略01
  20. 全国计算机等级三级网络技术试卷详解(三)

热门文章

  1. vue项目中使用腾讯美颜SDK
  2. Mysql安装测试数据库employees
  3. 监控卡驱动程序和软件的安装
  4. 梦幻西游广东区哪个服务器最稳定,梦幻西游:台州湾服战队要换区了,听说要去广东区的某个服务器...
  5. ROS下配置镭神智能c16雷达信息
  6. 用python编写录音机——GUI控制录音开始与结束(tkinter)
  7. 【金融案例分析01】GME游戏驿站:股票为何暴涨暴跌?是散户大战华尔街大鳄?阴谋论?还是正常市场行为? 一文用金融原理进行趣味解读。
  8. Word首页不设置页码
  9. Kibana:使用 Maps 来显示分布式的团队
  10. JAVA XML 之 DTD约束