同一個會話期間只要查詢過的數據都會被保存在當前SqlSession的一個Map中
- key:hashCode+查詢的SqlId+編寫的sql查詢語句+參數java
同一個SqlSession兩次查詢期間手動清空了緩存。sql
eviction="FIFO" :緩存回收策略
- LRU(最近最少使用):移除最長時間不被使用的對象。
- FIFO(先進先出):按對象進入緩存的順序來移除對象。
- SOFT(軟引用):移除基於垃圾回收期狀態和軟引用規則的對象。
- WEAK(弱引用):更積極地移除基於垃圾收集器狀態和弱引用規則的對象。
- 默認的是LRU數據庫
flushInterval:刷新間隔,單位毫秒
- 默認狀況下不設置,也就是沒有刷新間隔,緩存僅僅調用語句時刷新。緩存
size:引用數目,正整數
- 表明緩存最多能夠存儲多少個對象,太大容易致使內存溢出tomcat
readOnly:只讀,true/false
- true:只讀緩存;會給全部調用者返回緩存對象的相同實例。這些對象不能被修改。這提供了很重要的性能優點。
- false:讀寫緩存,會返回緩存對象的拷貝(經過序列化)。這會慢一些,可是安全,默認爲false。安全
全局setting的cacheEnable
- 配置二級緩存的開關,一級緩存一直是打開的。session
select標籤的useCache屬性
- 配置這個select是否使用二級緩存。一級緩存一直是使用的。mybatis
sql標籤的flushCache屬性:
- 增刪改默認爲true,sql執行後,會清空一級和二級緩存。查詢默認false。app
sqlSession.claerCache()
- 用來清除一級緩存性能
當在某一個做用域(一級緩存/二級緩存/Namespace)進行了增刪改操做化,默認該做用域下全部select中的緩存將被clear。
@Intercepts({ @Signature(type=StatementHandler.class,method="prepare", args={Connection.class}) }) public class MyPlugin implements Interceptor{}
<plugins> <plugin interceptor="com.desperado.plugin.MyPlugin"> <property name="username" value="tomcat"/> </plugin> </plugins>
//1.分離代理對象。因爲會造成屢次代理,因此須要經過while循環分離出最終被代理的對象,從而方便提取信息。 MetaObject metaObject = SystemMetaObject.forObject(target); while(metaObject.hasGetter("h")){ Object h = metaObject.getValue("h"); metaObject = SystemMetaObject.forObject(h); } //2.獲取到代理對象中包含的被代理的真實對象 Object obj = metaObject.getValue("target"); //3.獲取被代理對象的MetaObject方便進行信息提取 metaObject forObject = SystemMetaObject.forObject(obj);
默認的openSession()方法沒有參數,使用它建立的SqlSession具備以下特性:
- 會開啓一個事務(也就是 不自動提交)
- 鏈接對象會從由活動環境配置的數據源實例獲得。
- 事務隔離級別將會使用驅動或數據源的默認設置。
- 預處理語句不會被複用,也不會批量處理更新。
openSession方法的ExecutorType類型的參數,枚舉類型,取值以下:
- SIMPLE:這個執行器類型不作特殊的事情(這是默認裝配的)。它爲每一個語句的執行建立一個新的預處理語句。
- REUSE:這個執行器類型會複用預處理語句。
- BATCH:這個執行器會批量執行全部更新語句。
批量操做就是使用MyBatis提供的BATCH類型的Executor進行的,它的底層就是經過暫存sql的方式進行的。能夠保存sql到必定數量後發給數據庫執行一次。
與Spring整合中。推薦額外配置一個能夠專門用來執行批量操做的sqlSession,須要使用的時候,注入配置的批量操做的SqlSession,經過它獲取到mapper映射器進行操做。
途觀想讓其提早執行,可使用sqlSession.flushStatements()方法,讓其執行刷到數據庫中進行執行。
<select id="callProcedure" statementType="CALLABLE"> call procedure_name(#{param1},#{param2}) </select>