Mybatis一级缓存、二级缓存
一級緩存:SqlSession
mybatis一級緩存是指在內存中開辟一塊區域,用來保存用戶對數據庫的操作信息(sql)和數據庫返回的數據,如果下一次用戶再執行相同的請求,那么直接從內存中讀數數據而不是從數據庫讀取。
SqlSessionFactoryBuilder:通過SqlSessionFactoryBuilder來構建SqlSessionFactory實例,一旦創建了 SqlSessionFactory,就不再需要SqlSessionFactoryBuilder 了,當然可以重用 SqlSessionFactoryBuilder 來創建多個 SqlSessionFactory 實例。
SqlSessionFactory: 每個MyBatis集成的應用都是以一個SqlSessionFactory實例為中心,一旦被創建就應該在應用的運行期間一直存在。使用 SqlSessionFactory 是在應用運行期間不需要創建多次,有很多方法可以做到,最簡單的就是使用單例模式或者靜態單例模式。
SqlSession:SqlSession 的實例不是線程安全的,因此是不能被共享的,所以它用于請求或方法范圍。不能將 SqlSession 實例的引用放在一個類的靜態域,或者一個類的實例變量。應用每次收到客戶端一個 HTTP 請求,就可以打開一個 SqlSession,返回一個響應,然后關閉它。
在spring mvc 架構中,每次請求都會客戶端的請求都會通過控制層(controller)進入業務層(service),在業務層不加事務的情況下,如果是調用個mapper接口執行數據庫操作,則每次請求都會創建一個SqlSession去操作數據庫。
一級緩存使用場景:
在service層多次請求同一個mapper接口操作數據庫,并且每次請求的參數不變,則第一次執行后就會觸發一級緩存的使用,不再執行sql去查詢數據庫,直接讀取緩存的數據。
對SqlSession執行Commit操作,也就是對數據庫執行了update、delete、insert等操作,會清除一級緩存保存數據的HashMap結構數據,用戶在發起查詢請求時就會重新讀取數據并放入一級緩存中了。
每次查詢回去緩存中查找,如果找不到會去數據庫查詢,然后把查詢結果寫入緩存中。Mybatis內部使用HashMap結構存儲緩存數據,key為hashCode + statementId + sql 語句,value 為查詢出來的結果集映射成的java對象。
當MyBatis與spring整合后,如果沒有事務,一級緩存是失效的。解決該問題的辦法有兩種途徑:
有兩種途徑:
1.添加事務
2.使用二級緩存
二級緩存:Namespace
二級緩存的作用域是一個namespace。但并不是意味著同一個namespace的mapper接口可以互相讀取緩存內容,如果開啟了二級緩存,那么在關閉sqlsession后,會把該sqlsession一級緩存中的數據添加到namespace的二級緩存中。
開啟二級緩存:
1.打開二級緩存總開關
2.打開mapper的二級緩存開關
在mapper文件加入:
3.涉及二級緩存mapper操作的實例對象需要實現Serializable接口。
默認sqlsession提交事務后會關閉,并且會刷新緩存數據,如果在select 標簽加入 flushCache=“false” 則會禁止刷新,或者配置mapper 文件的<cache flushInterval=“1000”/ > 屬性,定期刷新緩存。
總結
以上是生活随笔為你收集整理的Mybatis一级缓存、二级缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JQuery选择器 属性值 等于 以开头
- 下一篇: 为什么不能在SQL拼接模糊匹配符号