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

在实际项目开发中,通常对数据库查询的性能要求很高,而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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值