Mybatis 缓存配置问题

仰望星空_Star 2016-10-04 10:32:17
上代码 :
先是MapperSql.xml
 <select id="findSingle" resultType="student" flushCache="true" useCache="true" >
SELECT * FROM N1 WHERE ID=#{id}
</select>

再来JAVA调用方法
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
InputStream input = TestDao.class.getClassLoader().getResourceAsStream(
"SqlMapConfig.xml");
SqlSessionFactory factory = builder.build(input);
SqlSession session1 = factory.openSession(true);
SqlSession session2 = factory.openSession(true);
CostMapperDao dao=session1.getMapper(CostMapperDao.class);
dao.findSingle(2);
session1.close();

CostMapperDao dao2=session2.getMapper(CostMapperDao.class);
dao2.findSingle(2);
session2.close();

但是对这个结果不太理解
注:缓存单独实现了一下,用的Redis作为测试

get key //注:调用Cache接口实现类中的getObject方法
获取到的对象为:null
DEBUG [main] - Cache Hit Ratio [org.dingxin.mapper.CostMapperDao]: 0.0
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 12451959.
DEBUG [main] - ==> Preparing: SELECT * FROM N1 WHERE ID=?
DEBUG [main] - ==> Parameters: 2(Integer)
DEBUG [main] - <== Total: 1
clear all data //注:调用Cache接口实现类中的clear方法
put key-1234809571:3046303058:org.dingxin.mapper.CostMapperDao.findSingle:0:2147483647:SELECT * FROM N1 WHERE ID=?:2:development
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@be0077]
DEBUG [main] - Returned connection 12451959 to pool.
get key //注:调用Cache接口实现类中的getObject方法
获取到的对象为:[Student{id=2, age=26, name='Y', sex='F', phone=null}]
DEBUG [main] - Cache Hit Ratio [org.dingxin.mapper.CostMapperDao]: 0.5
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Checked out connection 12451959 from pool.
DEBUG [main] - ==> Preparing: SELECT * FROM N1 WHERE ID=?
DEBUG [main] - ==> Parameters: 2(Integer)
DEBUG [main] - <== Total: 1
clear all data //注:调用Cache接口实现类中的clear方法
put key-1234809571:3046303058:org.dingxin.mapper.CostMapperDao.findSingle:0:2147483647:SELECT * FROM N1 WHERE ID=?:2:development
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@be0077]
DEBUG [main] - Returned connection 12451959 to pool.
Disconnected from the target VM, address: '127.0.0.1:61555', transport: 'socket'


大概流程是这样的:
SESSION1 调用GET方法去缓存中找结果,未找到,执行SQL,SESSION CLOSE ,清空二级缓存,将最新结果存入缓存中
SESSION12调用GET方法取到缓存值,执行SQL查询
不太明白,SESSION2已经取到的缓存值为什么还要去查询一次?难道用flushCache=true后useCache就无效了吗
...全文
321 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
仰望星空_Star 2016-10-06
  • 打赏
  • 举报
回复
是我想错了,第二次查询的结果确实是取的缓存的结果之所以会再执行一遍sql是因为flushCache=true的设置,目的是更新缓存而已
  • 打赏
  • 举报
回复
为false才不清空,为true当然清空了。
仰望星空_Star 2016-10-05
  • 打赏
  • 举报
回复
引用 1 楼 fangmingshijie 的回复:
select标签默认 flushCache=false,表示不清空本地缓存和二级缓存。
那为什么flshCache=true ,useCache=true后第二次查询还是会执行SQL查询一次呢?我的useCache=true呀
  • 打赏
  • 举报
回复
select标签默认 flushCache=false,表示不清空本地缓存和二级缓存。
  • 打赏
  • 举报
回复
一级缓存指的是同一个session才行。
仰望星空_Star 2016-10-05
  • 打赏
  • 举报
回复
引用 3 楼 fangmingshijie 的回复:
为false才不清空,为true当然清空了。
可能是我表述有问题,你看下日志,第一次查询结束后清空缓存,

clear all data      //注:调用Cache接口实现类中的clear方法
但接着又将查询到的结果存入了缓存中,

put key-1234809571:3046303058:
org.dingxin.mapper.CostMapperDao.findSingle:0:2147483647:SELECT * FROM N1 WHERE ID=?:2:development
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@be0077]
DEBUG [main] - Returned connection 12451959 to pool.
第二次查询的时候

get key                 //注:调用Cache接口实现类中的getObject方法
获取到的对象为:[Student{id=2, age=26, name='Y', sex='F', phone=null}][/b]
DEBUG [main] - Cache Hit Ratio [org.dingxin.mapper.CostMapperDao: 0.5
明显是取到了缓存但是下面为什么又执行了一次查询呢?明明已经取到结果了为什么还要再查询?
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Checked out connection 12451959 from pool.
DEBUG [main] - ==>  Preparing: SELECT * FROM N1 WHERE ID=? 
DEBUG [main] - ==> Parameters: 2(Integer)
DEBUG [main] - <==      Total: 1

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧