Mybatis强制查询问题
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强制查询问题相关推荐
- MyBatis关联查询、多条件查询
MyBatis关联查询.多条件查询 1.一对一查询 任务需求; 根据班级的信息查询出教师的相关信息 1.数据库表的设计 班级表: 教师表: 2.实体类的设计 班级表: public class Cla ...
- Mybatis联合查询
为什么80%的码农都做不了架构师?>>> 案例 一个博客系统中,用户可以任意发表博文(Post),用户还可以对博文进行评论(Comment).于是在这个系统中,存在以下的关系: ...
- Mybatis like查询的写法--转载
原文地址:http://lavasoft.blog.51cto.com/62575/1386870 Mybatis like查询官方文档没有明确的例子可循,网上搜索了很多,都不正确. Mybatis ...
- association 实现MyBatis分步查询与延迟加载
一.分步查询 1.1什么时候可以用到分步查询 有的时候需要我们对数据库进行关联查询,比如Employee 持有另一个Department对象的一个引用,我们希望在查询Employee 的时候把Depa ...
- MyBatis基础:MyBatis关联查询(4)
1. MyBatis关联查询简介 MyBatis中级联分为3中:association.collection及discriminator. ◊ association:一对一关联 ◊ collecti ...
- mybatis嵌套查询和嵌套结果有什么区别_Java面试专题之九:Mybatis面试5个大概率被问到的问题...
1.为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里? Hibernate 属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关联集合对象时,可以根据 ...
- MyBatis之查询缓存
MyBatis之查询缓存 2017/09/30 正如大多数持久层框架一样,MyBatis同样也提供了对查询数据的缓存支持.今后我们要学习的SpringMVC框架属于系统控制层,它也有它的缓存区域,对响 ...
- Mybatis in查询List或数组 场景实例
1.mybatis in 查询List时 业务代码示例如下: List<String> list=new ArrayList<String>(); ...;//向list中填装 ...
- mybatis 取查询值_MyBatis面试题集合,90%会遇到这些问题
点击蓝字关注我们吧! 1.#{}和${}的区别是什么? ${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com. ...
最新文章
- F5负载均衡的双机冗余配置与全冗余解析
- win7下安装linux(centos6.5)双系统详细小白教程
- 设计模式实战 - 责任链模式
- 添加RichEdit控件导致MFC对话框程序无法执行的解决方法
- 物理、线性、虚拟、逻辑、有效地址
- 云计算将为移动医疗带来哪些新机遇?
- React Native使用指南-使用链接库
- zookeeper中展示所有节点_分布式协调服务之Zookeeper
- 中国计算机学会第七届全国Web信息系统及其应用学术会议(WISA2010)征文通知
- SCOM2012功能测试(18)—对象发现(替代)
- 凭什么说这门编程语言是下一代 Java?
- win11如何查看下载速度 Windows11查看下载速度的方法介绍
- mysql错误诊断_MySQL Server无法启动错误诊断一则
- 基于DEV控件库的webservice打印.repx模板
- Kali-简易的Linux系统Dos网站压力测试(攻击)
- 电脑能正常上网上网,某些软件不能上网
- java int类型 BigDecimal类型转成汉字金额大写
- obs多推流地址_OBS下载、安装、使用(腾讯)推流直播教程
- maven 光速入门攻略01
- 全国计算机等级三级网络技术试卷详解(三)
热门文章
- vue项目中使用腾讯美颜SDK
- Mysql安装测试数据库employees
- 监控卡驱动程序和软件的安装
- 梦幻西游广东区哪个服务器最稳定,梦幻西游:台州湾服战队要换区了,听说要去广东区的某个服务器...
- ROS下配置镭神智能c16雷达信息
- 用python编写录音机——GUI控制录音开始与结束(tkinter)
- 【金融案例分析01】GME游戏驿站:股票为何暴涨暴跌?是散户大战华尔街大鳄?阴谋论?还是正常市场行为? 一文用金融原理进行趣味解读。
- Word首页不设置页码
- Kibana:使用 Maps 来显示分布式的团队
- JAVA XML 之 DTD约束