1. 程式人生 > >mybatis的二級快取

mybatis的二級快取

mybatis的操作物件叫
sqlsession
sqlsessionfactory來生成sqlsession


mybatis的事務管理機制
1·JDBC管理機制 JDBCTranstactionManager,呼叫java.sql.Connection來進行管理
2·交給容器本身進行事務管理 例spring -->SpringManagedTransaction(spring容器進行事務管理)


疑問:spring容器本身不能進行事務管理 因此還要將此事務管理轉移到哪?再給jdbc?脫了褲子放屁?


3·sqlsession含有兩個物件 configration及executor
第一個是配置屬性資訊,第二個才是真正的工作者
sqlsession所有操作都是通過executor進行呼叫的  
sqlsession只是對外暴露的介面。


Executor的實現類分別是以下三種,以下是它們的區別和它們的關係圖


1.SimpleExecutor是mybatis預設的實現類。它的特性是每對資料進行一次互動會關閉掉statement
2.ReuseExecutor會對statement進行重複使用。
對資料庫操作執行完成之後會把statement放在一個map裡面,key是執行的sql,value就是本次執行的statement物件。如果本次會話再次對資料進行操作。
那麼這個執行器會根據sql去呼叫這個map裡面statement去執行沒有則建立並存放到map裡同。而不是重新去例項化一個新的statement物件。
(類似hibernate的快取機制)
3.BatchExecutor支援批量操作
注:statement 就是java自帶的jdbc的資料操作物件


快取:
CachingExexutor是mybatis二級快取機制的體現,它也實現了Executor這個介面 (裝飾者模式),
注:裝飾者模式好好看一下


一級快取是基於sqlsession生命週期  他的生命週期是session(會話)級別的,
快取物件將查詢結果放在map裡儲存,方便下次同樣的請求來呼叫
key是引數,id,條件等


二級快取:
二級快取是application級別,所有會話都可以對這個快取物件進行操作的。
這個快取是共享的。
這個快取級別粒度非常細。在開發過種中開發者可以自定義快取實現方式,需要實現Cache介面。
需要在maaper檔案裡面配置通過cache標籤配置快取。
二級快取不能進行多表操作 不能再不同namespace下使用 否則造成資料幻讀等現象


注:mybatis是快取機制是先呼叫 二級快取,如果不存在再去呼叫一級快取。如果一級快取也不存在。才會去資料庫查。 


StatementHandler處理器:
statement:正常的操作
PreparedStatement:預編譯
CallableStatement :呼叫儲存過程