有关Mybatis中缓存的理解(个人)

区别

一级缓存(Local Cache)的作用域:一个SqlSession(底层是hashmap,线程不安全,所以每个Sqlsession不会共享一级缓存)
二级缓存(Second Level Cache)的作用域:namespace(底层是LinkedHashMap,线程安全,不同的SqlSession可以共享二级缓存)

Mybatis中缓存原理简图如下有关Mybatis中缓存的理解(个人)_第1张图片

Demo

package com.cy.pj.sys.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.cy.pj.sys.entity.SysRole;

@SpringBootTest
public class DaoMemoryTests {

	@Autowired
	private SqlSessionFactory sqlSessionFactory;
	//MyBatis一级缓存测试
	//特点:默认开启,不可以跨SqlSession共享。
	@Test
	public void testFirstLevelCache() {
		//1.获取sqlSession对象(DefaultSqlSession-线程不安全)
		SqlSession sqlSession=sqlSessionFactory.openSession();
		System.out.println("sqlSession="+sqlSession);
		//2.执行查询操作
		String statement="com.cy.pj.sys.dao.SysRoleDao.findPageObjects";
		Map parameterMap=new HashMap<>();
		parameterMap.put("name", "");
		parameterMap.put("startIndex", 0);
		parameterMap.put("pageSize", 3);
		List list=sqlSession.selectList(statement, parameterMap);
		System.out.println("list.size="+list.size());
		//使用同一个sqlSession执行同样的查询,第二查询会从cache中获取。
		list=sqlSession.selectList(statement, parameterMap);
		System.out.println("list.size="+list.size());
		//3.释放资源
		sqlSession.close();
	}
	@Test
	public void testSecondLevelCache() {
		doQueryRoles();
		doQueryRoles();
	}
	private void doQueryRoles() {
		//1.获取sqlSession对象(DefaultSqlSession-线程不安全)
		SqlSession sqlSession=sqlSessionFactory.openSession();
		System.out.println("sqlSession="+sqlSession);
		//2.执行查询操作
		String statement="com.cy.pj.sys.dao.SysRoleDao.findPageObjects";
		Map parameterMap=new HashMap<>();
		parameterMap.put("name", "");
		parameterMap.put("startIndex", 0);
		parameterMap.put("pageSize", 3);
		List list=sqlSession.selectList(statement, parameterMap);
		System.out.println("list.size="+list.size());
		//3.释放资源
		sqlSession.close();
	}
}

关于Mybatis使用的模式

~装饰模式:
有关Mybatis中缓存的理解(个人)_第2张图片

你可能感兴趣的:(有关Mybatis中缓存的理解(个人))