浅谈MyBatis一级缓存
一、什么是一級緩存
每一次在和數據庫進行會話的過程中,MyBatis 都會創建一個SqlSession對象。同一次會話期間,只要是查詢過的數據,都會保存在當前SqlSession對象的一個Map中。所以在一次會話的過程中,如果我們對一條查詢SQL 語句進行了多次執行,經過判斷后和之前執行的查詢語句相同,并且在緩存中存在該SQL 語句的執行結果,那么這次查詢就不會再從數據庫中獲取數據,而是直接從緩存中獲取數據。
因為一級緩存是建立在SqlSession對象中的,所以也可以說一級緩存是一個SqlSession級別的緩存。在默認的情況下,一級緩存是開啟的。
下面我們就來體驗一下一級緩存的作用。
二、一級緩存初體驗
因為一級緩存是默認開啟的,所以不需要我們進行任何配置。
mapper 接口:
Employee getEmpById(Integer id);SQL 映射文件:
<select id="getEmpById" resultType="com.jas.mybatis.bean.Employee">SELECT * FROM t_employee WHERE id = #{id}</select>測試代碼:
// 用于創建SqlSession 對象private SqlSession getSqlSession() throws IOException {String resource = "mybatis-config.xml";InputStream is = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession = sqlSessionFactory.openSession();return sqlSession;}@Testpublic void testCache() throws IOException {SqlSession sqlSession = getSqlSession();EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);// 從數據庫中獲得id 為1 的員工信息Employee employee1 = employeeMapper.getEmpById(1);System.out.println(employee1);// 再一次從數據庫中獲得id 為1 的員工信息Employee employee2 = employeeMapper.getEmpById(1);System.out.println(employee2);sqlSession.close();}上面的測試過程中一共對id為1 的員工信息進行了兩次查詢,并且在中間過程中沒有進行其他的操作,下面我們通過SQL 日志來看看執行的過程。
雖然我們執行了兩次查詢,但是從執行結果來看,其實只發送了一條SQL 語句,在第二次獲得員工信息的時候并不是從數據庫中獲取數據,而是直接在一級緩存中獲得數據,這就是一級緩存起到的作用。
三、一級緩存失效
我們知道,一級緩存是一個SqlSession級別的緩存,所以一級緩存在工作的過程中會有一定的局限。
一級緩存失效的情況:
1.只對當前SqlSession對象生效,對于其他的SqlSession來說一級緩存是不起作用的。
2.是同一個SqlSession對象,但是執行的是不同條件的SQL 查詢語句。
3.同一個SqlSession對象執行同一條件的查詢語句,但中間執行了增刪改的操作,之前一級緩存中的數據會失效。如果執行的是不同條件的查詢語句,一級緩存仍然生效,并且會把新的查詢數據也加入到一級緩存中。
4.多次相同查詢語句在執行期間通過sqlSession.clearCache();方法清除了緩存。
5.SqlSession 對象調用了close()方法,當前會話結束,一級緩存不再生效。
對于上面的幾種情況,一級緩存都是不起作用的。所以在處理業務的時候要根據需求,具體分析能不能使用一級緩存。
四、總結
這篇博文主要對MyBatis 中的一級緩存進行了一些介紹,并把常見的一級緩存失效的幾種情況也進行了描述,希望能夠為學習緩存的小伙伴提供一些幫助。如果想要更深了解一些關于一級緩存原理的知識,可以點擊下面的鏈接,總結的很清楚,前排致敬前輩。
《深入理解mybatis原理》 MyBatis的一級緩存實現詳解 及使用注意事項
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的浅谈MyBatis一级缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑怎么添加usb启动项 电脑如何添加U
- 下一篇: 浅谈MyBatis二级缓存