MyBatis缓存是如何实现持久化并优化数据库查询效率的?
- 内容介绍
- 文章标签
- 相关推荐
本文共计646个文字,预计阅读时间需要3分钟。
一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,该Session中的所有Cache将被清空。
package me.gacl.test; import me.gacl.domain.User; import me.gacl.util.MyBatisUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; /** * @author gacl * 测试一级缓存 */ public class TestOneLevelCache { /* * 一级缓存: 也就Session级的缓存(默认开启) */ @Test public void testCache1() { SqlSession session = MyBatisUtil.getSqlSession(); String statement = "me.gacl.mapping.userMapper.getUser"; User user = session.selectOne(statement, 1); System.out.println(user); /* * 一级缓存默认就会被使用 */ user = session.selectOne(statement, 1); System.out.println(user); session.close(); /* 1. 必须是同一个Session,如果session对象已经close()过了就不可能用了 */ session = MyBatisUtil.getSqlSession(); user = session.selectOne(statement, 1); System.out.println(user); /* 2. 查询条件是一样的 */ user = session.selectOne(statement, 2); System.out.println(user); /* 3. 没有执行过session.clearCache()清理缓存 */ //session.clearCache(); user = session.selectOne(statement, 2); System.out.println(user); /* 4. 没有执行过增删改的操作(这些操作都会清理缓存) */ session.update("me.gacl.mapping.userMapper.updateUser", new User(2, "user", 23)); user = session.selectOne(statement, 2); System.out.println(user); } } 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache
/*
1. 映射语句文件中的所有select语句将会被缓存。 2. 映射语句文件中的所有insert,update和delete语句会刷新缓存。 3. 缓存会使用Least Recently Used(LRU,最近最少使用的)算法来收回。 4. 缓存会根据指定的时间间隔来刷新。 5. 缓存会存储1024个对象
本文共计646个文字,预计阅读时间需要3分钟。
一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,该Session中的所有Cache将被清空。
package me.gacl.test; import me.gacl.domain.User; import me.gacl.util.MyBatisUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; /** * @author gacl * 测试一级缓存 */ public class TestOneLevelCache { /* * 一级缓存: 也就Session级的缓存(默认开启) */ @Test public void testCache1() { SqlSession session = MyBatisUtil.getSqlSession(); String statement = "me.gacl.mapping.userMapper.getUser"; User user = session.selectOne(statement, 1); System.out.println(user); /* * 一级缓存默认就会被使用 */ user = session.selectOne(statement, 1); System.out.println(user); session.close(); /* 1. 必须是同一个Session,如果session对象已经close()过了就不可能用了 */ session = MyBatisUtil.getSqlSession(); user = session.selectOne(statement, 1); System.out.println(user); /* 2. 查询条件是一样的 */ user = session.selectOne(statement, 2); System.out.println(user); /* 3. 没有执行过session.clearCache()清理缓存 */ //session.clearCache(); user = session.selectOne(statement, 2); System.out.println(user); /* 4. 没有执行过增删改的操作(这些操作都会清理缓存) */ session.update("me.gacl.mapping.userMapper.updateUser", new User(2, "user", 23)); user = session.selectOne(statement, 2); System.out.println(user); } } 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache
/*
1. 映射语句文件中的所有select语句将会被缓存。 2. 映射语句文件中的所有insert,update和delete语句会刷新缓存。 3. 缓存会使用Least Recently Used(LRU,最近最少使用的)算法来收回。 4. 缓存会根据指定的时间间隔来刷新。 5. 缓存会存储1024个对象

