spring集成mybatis后一级缓存失效

mybatis缓存:

1、一级缓存默认开启,缓存在内存中(PerpetualCache),依赖session生命周期,session关闭即缓存失效。

2、二级缓存非默认开启,缓存可以通过开关设置启用,默认使用PerpetualCache实现,可扩展支持外部缓存。

mybatis源码片段:

  // 解析sql对象
  BoundSql boundSql = ms.getBoundSql(parameterObject);
  // 根据MappedStatement、parameterObject、rowBounds、boundSql生成缓存key对象
  CacheKey key = createCacheKey(ms, parameterObject, rowBounds, boundSql);
  // 执行查询
  return query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
 ......
  List<E> list;
  try {
    queryStack++;
    // 此处会先判断缓存是否存在,相同session相同查询会直接返回缓存结果
    list = resultHandler == null ? (List<E>) localCache.getObject(key) : null;
    if (list != null) {
      handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);
    } else {
      list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);
    }
  } finally {
    queryStack--;
  }
......

spring集成mybatis:

1、spring通过SqlSessionTemplate获取mybatis中SqlSession对象。

2、查询执行时,spring获取SqlSession对象并与当前线程绑定(ThreadLocal)。

3、查询结束后,清空threadlocal中与当前线程绑定的sqlsession,释放资源。

4、再次相同查询时,获取的是不同的SqlSession对象,上次查询结果缓存也随着关闭而失效;所以此时相同查询也将会查询数据库数据。

事物开启时,缓存生效?

spring事物开启时,为了保证事物一致性,spring在事物方法执行过程中使用的是同一个SqlSession对象;所以在同一个事物中多次相同查询时缓存会生效;但是事物方法执行结束后再次查询,同样缓存将再次失效。

相关源码片段:

    // 获取session对象
      SqlSession sqlSession = getSqlSession(
          SqlSessionTemplate.this.sqlSessionFactory,
          SqlSessionTemplate.this.executorType,
          SqlSessionTemplate.this.exceptionTranslator);
// 获取当前线程绑定的SqlSessionHolder资源
SqlSessionHolder holder = (SqlSessionHolder) TransactionSynchronizationManager.getResource(sessionFactory);
    if ((holder != null) && (holder.getSqlSession() == session)) {
      if (LOGGER.isDebugEnabled()) {
        LOGGER.debug("Releasing transactional SqlSession [" + session + "]");
      }
      // 如果是同一个sqlsession对象,则减少SqlSessionHolder引用次数
      holder.released();
    } else {
      if (LOGGER.isDebugEnabled()) {
        LOGGER.debug("Closing non transactional SqlSession [" + session + "]");
      }
      // 非事物下将直接关闭session对象
      session.close();
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值