mybatis-spring_緩存

學習之前需要先了解一下什麼是mybatis一級緩存?

LZ推薦:https://blog.csdn.net/niunai112/article/details/80601793#%E4%B8%80%E7%BA%A7%E7%BC%93%E5%AD%98,寫的很清晰
原理圖:(需要理解)

問題1、問什麼mybatis-結合spring後一級緩存失效?

這個地方有個很重要的只是就是mybatis-4中補充的知識點,代理對象的方法其實調用的就是被代理對象的invoke方法。單獨使用mybatis的時候,執行的是DefaultSqlSession類,但是當mybatis-spring結合使用的時候,用的sqlsession對象是sqlsessiontemplate,可以在裏面看到invoke方法,在方法的結尾處finally中會關閉sqlsession。這纔是爲什麼失效的原因,sqlsession關閉後一級緩存必然消失。下面我們去看一下相關源碼

直接找到MapperProxy(映射代理類)中的invoke方法。
MapperMethod mapperMethod = this.cachedMapperMethod(method); method這個參數就是接口的類+方法(結合mybatis-4中的代碼,想了解的可以看看)

 

return mapperMethod.execute(this.sqlSession, args);sqlSession就是上述所說的SqlSessionTemplate

經過上述斷點進入到SqlSessionTemplate.class

 

2、爲什麼mybatis-spring會在finally中關閉sqlsession?
單獨的mybatis是創建的sqlsession對象,隨時使用隨時關閉,但是bybatis-spring中使用的是SqlSessionFactoryBean創建的sqlsession,必須關閉,否者就無法關閉,因爲我們使用的sqlsession是使用代理模式創建的,不關閉的話,用戶無法操作這個sqlsession對象,所以必須關閉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章