当前位置:   article > 正文

mysql session缓存_MyBatis的缓存机制:一级缓存(SqlSession级别)

sqlsession缓存 select update select 查询的是最新数据吗

在实际项目开发中,通常对数据库查询的性能要求很高,而MyBatis提供了查询缓存来缓存数据,从而达到提高查询性能的要求.MyBatis的查询缓存分为一级缓存和二级缓存.一级缓存是SqlSession级别的缓存,二级缓存是mapper级别的缓存,二级缓存是多个SqlSession共享的.MyBatis通过缓存机制减轻数据压力,提高数据库性能.

MyBatis的一级缓存是SqlSession级别的缓存,在操作数据库时需要构造SqlSession对象,当在同一个SqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率,需要注意的是,如果SqlSession执行了DML操作(insert,update,delete)并提交到数据库,MyBatis则会清空SqlSession中的一级缓存,这样做的目的是为了保证缓存中存储的是最新效率,避免出现脏读现象.

当一个SqlSession结束后该SqlSession中的一级缓存也就不存在了.MyBatis默认开启一级缓存,不需要进行任何配置.

示例:OneLevelCacheTest

1.userMapper.xml

/p>

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

SELECT * FROM tb_user WHERE ID=#{id}

SELECT * FROM tb_user

DELETE FROM tb_user WHERE id=#{id}

2..userMapper.java

public interface UserMapper

{

//根据ID查询User

User selectUserById(Integer id);

//查询所有User

List selectAllUser();

//根据ID删除User

void deleteUserById(Integer id);

}

3.控制器

@GetMapping("/mysql/cache/")

public void cache()

{

//获得SqlSession实例

SqlSession sqlSession = FKSqlSessionFactory.getSqlSession();

//获得Mapper接口代理对象

UserMapper em = sqlSession.getMapper(UserMapper.class);

//按ID查询

User user1 = em.selectUserById(5);

User user2 = em.selectUserById(6);

User user3 = em.selectUserById(5);

}

4.输出

74af5943094473b703fe9516ec32560a.png

可以看出第一次查询ID=5的User对象时执行了一条select语句,但是第二次获取id为5的User对象时,并没有执行select语句.因为此时一级缓存也就是SqlSession缓存已经缓存了id=5的User对象,MyBatis直接从缓存中将对象取出来,并没有再次去数据库查询,所以第二次没有再执行select语句.

5.控制器

@GetMapping("/mysql/cache2/")

public void cache2()

{

//获得SqlSession实例

SqlSession sqlSession = FKSqlSessionFactory.getSqlSession();

//获得Mapper接口代理对象

UserMapper em = sqlSession.getMapper(UserMapper.class);

//按ID查询

User user1 = em.selectUserById(5);

em.deleteUserById(5);

User user2 = em.selectUserById(5);

}

6.输出

e5d90ca4750c15fe871d3ab68db934d4.png

在第一次查询id为5的User对象之后,执行了一个delete操作,MyBatis为了保证缓存中的是最新的信息,会清空SqlSession中的缓存,当第二次获取id为5的User对象时,一级缓存也就是SqlSession缓存中并没有缓存任何对象,所以MyBatis再次执行select语句去查询id=5的对象

由于我们没有执行

sqlSession.commit();

所以数据库仍然存在ID=5的User对象

de4ec461e454c8a47f5dc738fc05db81.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/159827
推荐阅读
相关标签
  

闽ICP备14008679号