乐趣区

关于java:这份Mybaits缓存机制总结阿里大佬看完直呼牛批到底有多强

Hello,明天给各位童鞋们分享 Mybaits 缓存,连忙拿出小本子记下来吧!

1. 一级缓存

本地缓存

与数据库同一次会话期间查问到的数据会放在本地缓存中

当前如果须要获取雷同的数据, 间接从缓存中拿

一级缓存是主动开启的。上面的 4 种办法是使得一级缓存生效的

1.sqlSession 不同

2.sqlSession 雷同, 查问条件不同

3.sqlSession 雷同, 查问期间执行了增删操作

4. 手动革除了一级缓存

1.1 一级缓存初体验

@Test

public void test1()throws Exception{SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

    SqlSession openSession = sqlSessionFactory.openSession();

    EmployMapper mapper = openSession.getMapper(EmployMapper.class);

    Employee id = mapper.getId(2);

    System.out.println(id);

    Employee id1 = mapper.getId(2);

    System.out.println(id1);

    openSession.close();}

因为有一级缓存的缘故, 所以不必再调用 sqlSession

1.2 一级缓存生效

sqlSession 不同

@Test

public void test1()throws Exception{SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

    SqlSession openSession = sqlSessionFactory.openSession();

    EmployMapper mapper = openSession.getMapper(EmployMapper.class);

    Employee id = mapper.getId(2);

    System.out.println(id);

    SqlSession openSession1 = sqlSessionFactory.openSession();

    EmployMapper mapper1 = openSession1.getMapper(EmployMapper.class);

    Employee id1 = mapper1.getId(2);

    System.out.println(id1);

    openSession.close();}

因为 SqlSession 的不同

使得没有缓存

2.sqlSession 雷同, 查问条件不同

3.sqlSession 雷同, 查问期间执行了增删操作

​4. 手动革除了一级缓存

执行了 openSession.clearCache() 办法

2. 二级缓存

全局缓存

是基于 namespace 级别的缓存, 一个 namespace 对一个二级缓存

1. 查问一条数据, 放在一级缓存

2. 如果会话敞开, 一级到二级, 新的会话信息, 会参照二级缓存

3. 不同的 namespace 会放在不同的 map 中, 不同的二级缓存中

2.1 开启二级缓存

<settings>

<!–// 开启二级缓存 –>

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

</settings>

开启二级缓存

test.java

@Test

public void test2()throws Exception{SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

    SqlSession openSession = sqlSessionFactory.openSession();

    SqlSession openSession1 = sqlSessionFactory.openSession();

    EmployMapper mapper = openSession.getMapper(EmployMapper.class);

    EmployMapper mapper1 = openSession1.getMapper(EmployMapper.class);

    Employee id = mapper.getId(3);

    System.out.println(id);

    openSession.close();

    Employee id1 = mapper1.getId(3);

    System.out.println(id1);

    openSession1.close();}

留神要敞开再获取第二个, 不然不会开启二级缓存, 因为只有会话敞开的时候一级缓存才会转为二级缓存

2.2 二级缓存的属性

cacheEnabled=“true”

开启二级缓存

cacheEnabled=“false”

敞开二级缓存, 然而一级缓存没有敞开
![上传中 …]()

useCache=“false”

则二级缓存不能够应用, 然而一级缓存还能够应用

flushCache=”true” 的话一级和二级缓存都会革除

默认为 false

3. 缓存原理图

缓存查问程序:

二级缓存

一级缓存

数据库

好啦,明天的文章就到这里,心愿能帮忙到屏幕前迷茫的你们!

退出移动版