美文网首页
Mybatis 的 SqlSession

Mybatis 的 SqlSession

作者: 放开那个BUG | 来源:发表于2020-08-26 10:57 被阅读0次

    1、概念

    MyBatis的一级缓存最大范围是SqlSession内部,即一级缓存只是对当前 SqlSession 中的 SQL 语句有效。

    MyBatis的二级缓存相对于一级缓存来说,实现了SqlSession之间缓存数据的共享,同时粒度更加的细,能够到namespace级别(针对同一个 Mapper 中不同的 SqlSession),通过Cache接口实现类不同的组合,对Cache的可控性也更强。

    从Spring事务管理器中获取一个sqlsession,如果没有,则创建一个新的,这句话的意思其实就是如果是一个事务,则这个事务里所有的 SQL 操作 的 sqlSession 用一个;如果没有,每条 SQL 操作都是用新的。
    再通俗易懂一点:如果在事务里,则Spring给你的sqlSession是一个,否则,每一个sql给你一个新的sqlSession。这里生成的sqlSession其实就是DefaultSqlSession了。

    2、事例

    其实,Mybatis的一级缓存就是 SqlSession 级别的,只要SqlSession 不变,则默认缓存生效,也就是说,如下的代码,实际上只会查一次库的:
    XxxxxMapper xxxxxMapper = session.getMapper(xxxxxMapper.class);
    //对应的sql为: select id from test_info;
    xxxxxMapper.selectFromDb();
    xxxxxMapper.selectFromDb();
    xxxxxMapper.selectFromDb();

    实际上只会被执行一次 SQL 查询。
    但是,在日常使用中,我们都是使用spring来管理Mapper,在执行selectFromDb 这个操作的时候,其实每次都会有一个新的SqlSession,所以,Mybatis的一级缓存是用不到的。

    3、总结

    所谓 mybatis 一级或者二级缓存弱鸡的要死,难怪没人用。

    相关文章

      网友评论

          本文标题:Mybatis 的 SqlSession

          本文链接:https://www.haomeiwen.com/subject/sjsxsktx.html