1. 緩存的概念
-
緩存的概念
- 在內存中臨時存儲數據,速度快,可以減少數據庫的訪問次數。
- 經常需要查詢,不經常修改的數據,不是特別重要的數據都適合于存儲到緩存中。
2.Mybatis緩存
- mybatis包含了一個非常強大的查詢緩存特性,他可以非常方便的定制和配置緩存。緩存可以極大的提高查詢的效率
- mybatis系統當中默認定義了兩級緩存:一級緩存和二級緩存
- 默認情況之下,只有一級緩存開啟(sqlSession級別的緩存)
- 二級緩存需要手動開啟配置,需要局域namespace級別的緩存。
1.一級緩存(也叫本地緩存)
-
MyBatis的一級緩存也是SqlSession的緩存。
-
SqlSession對象中維護了一個Map集合,用于存儲相互的緩存數據。
-
查詢的時候,先從SqlSession的緩存中查找,如果有,直接返回。如果沒有,查詢數據庫。
-
證明一級緩存的存在,通過用戶id查詢2次,查看結果。
public class UserTest {private InputStream in = null;private SqlSession session = null;private UserDao mapper = null;/*** 測試查詢所有的方法*/@Testpublic void findById() throws IOException {//加載主配置文件,目的是為了構建SqlSessionFactory對象in = Resources.getResourceAsStream("SqlMapConfig.xml");//創建SqlSessionFactory對象SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);//通過SqlSessionFactory工廠對象創建SqlSesssion對象session = factory.openSession();//通過Session創建UserDao接口代理對象mapper = session.getMapper(UserDao.class);User user1 = mapper.findById(1);System.out.println(user1.toString());System.out.println("-----------------");User user2 = mapper.findById(1);System.out.println(user2.toString());System.out.println(user1 == user2);//釋放資源session.close();in.close();} }
緩存失效的情況:
- sqlSession不同
- sqlSession相同,查詢條件不同
- sqlSession相同,兩次查詢之間執行了增刪改操作
- sqlSession相同,手動清除一級緩存