“进阶:查询缓存”的版本间差异

来自Wikioe
跳到导航 跳到搜索
第75行: 第75行:


=== 实现序列化 ===
=== 实现序列化 ===
'''二级缓存需要查询结果映射的pojo对象实现java.io.Serializable接口实现序列化和反序列化操作'''
* 注意如果存在父类、成员pojo都需要实现序列化接口。
<syntaxhighlight lang="java">
public class Orders implements Serializable
public class User implements Serializable
  ...
</syntaxhighlight>


=== 示例 ===
=== 示例 ===

2020年10月12日 (一) 10:30的版本


关于

Mybatis缓存.png

Mybatis一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。
Mybatis默认开启一级缓存。

Mybatis二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。
Mybatis二级缓存默认关闭。

一级缓存

Mybatis一级缓存.png

  1. 一级缓存区域是根据SqlSession为单位划分的。
  2. 每次查询会先从缓存区域找,如果找不到再从数据库查询,并将查询到的数据写入缓存。
  3. Mybatis内部存储缓存使用一个HashMap
    • key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象;
  4. sqlSession执行insert、update、delete等操作commit提交后会清空缓存区域。

示例

	//获取session
	SqlSession session = sqlSessionFactory.openSession();
	//获限mapper接口实例
	UserMapper userMapper = session.getMapper(UserMapper.class);
	
	//第一次查询
	User user1 = userMapper.findUserById(1);
	System.out.println(user1);
	
	//第二次查询,由于是同一个session则不再向数据发出语句直接从缓存取出
	User user2 = userMapper.findUserById(1);
	System.out.println(user2);
	
	//在同一个session执行更新
	User user_update = new User();
	user_update.setId(1);
	user_update.setUsername("李奎");
	userMapper.updateUser(user_update);
	session.commit();
	
	//再一次查询,虽然是同一个session但是由于执行了更新操作session的缓存被清空,这里重新发出sql操作
	User user3 = userMapper.findUserById(1);
	System.out.println(user3);
	
	//关闭session
	session.close();

二级缓存

Mybatis二级缓存.png

  1. 二级缓存区域是根据mapper的namespace划分的,相同namespace的mapper查询数据放在同一个区域
    • 如果使用mapper代理方法每个mapper的namespace都不同,此时可以理解为二级缓存区域是根据mapper划分;
  2. 每次查询会先从缓存区域找,如果找不到再从数据库查询,并将查询到的数据写入缓存。
  3. Mybatis内部存储缓存使用一个HashMap
    • key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象;
  4. sqlSession执行insert、update、delete等操作commit提交后会清空缓存区域。

开启二级缓存

设置 描述 允许值 默认值
cacheEnabled 对在此配置文件下的所有cache 进行全局性开/关设置。 true | false true

Mybatis的二级缓存默认是不开启的,需要时在SqlMapConfig.xml中加入:

	<setting name="cacheEnabled" value="true"/>

实现序列化

二级缓存需要查询结果映射的pojo对象实现java.io.Serializable接口实现序列化和反序列化操作

  • 注意如果存在父类、成员pojo都需要实现序列化接口。
	public class Orders implements Serializable
	public class User implements Serializable
   ...

示例

statement的二级缓存设置

禁用缓存

刷新缓存

Mybatis Cache参数

整合ehcache