MyBatis一级缓存和二级缓存

简述

mybatis提供了缓存机制减轻数据库压力,提高数据库性能。

mybatis的缓存分为两级:一级缓存、二级缓存。

一级缓存

一级缓存是在SqlSession上的缓存,默认情况下,MyBatis系统会开启一级缓存,也就是对于SqlSession层面的缓存,这个缓存不需要POJO对象可序列化。

测试一级缓存:

@Test
public void testFindUser() throws IOException {
	//读取核心配置文件
	String file = "sqlMapConfig.xml";
	InputStream in = Resources.getResourceAsStream(file);
	//日志
	Logger logger = Logger.getLogger(MybatisFirstTest.class);
	//创建sqlsessionfactory
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
	//创建sqlSession
	SqlSession sqlSession = sqlSessionFactory.openSession();
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
	User u = userMapper.getUser(1L);		
	logger.info("再获取一次POJO....");
	User u1 = userMapper.getUser(1L);	
	
	sqlSession.close();	
}

这段代码对同一对象进行两次获取,但是在日志中显示只有一条SQL语句被执行,原因是使用了同一个SqlSession对象获取数据,当一个SqlSession第一次通过SQL和参数获取对象后会将其缓存起来,如果下一次SQL和参数没有发生变化,并且缓存没有超时或者需要刷新时,它就会从缓存中直接取数据。

二级缓存

二级缓存是在SqlSessionFactory上的缓存,默认情况下,MyBatis系统不会开启二级缓存,需要手动开启,开启二级缓存只需要在映射文件上添加代码:

<cache/>

这个时候MyBatis会序列化和反序列化对应的POJO对象,也就要求POJO需要实现序列化接口。如果实体类没有实现序列化接口,MyBatis会抛出异常。

public class User implements Serializable{
	public static final long serialVersionUID = 598736524547906734L;
	.........................
}

这个时候从日志上就可以看到不同的SqlSession在获取同一条记录时,都是只发送过一次SQL获取数据,MyBatis将其保存在SqlSessionFactory层面,提供给各个SqlSession使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值