Mybatis的一級緩存,二級緩存過期時間分析

Mybatis的緩存級別
Mybatis提供了查詢緩存來查詢數據,使在項目開發中提高性能。 Mybatis的緩存分爲一級緩存和二級緩存,一級緩存是SqlSession級別的緩存,二級緩存是mapper級別的緩存,二級緩存是多個SqlSession共享的。Mybatis通過緩存機制減輕數據壓力,提高數據庫的性能。
一.一級緩存沒有過期時間,只有生命週期
(1).Mybatis在開啓一個數據庫會話時,會創建一個新的SqlSession對象。SqlSession對象的緩存是Mybatis的一級緩存,在操作數據庫時需要創建SqlSession對象,在對象中有hashMap用於保存緩存數據對象的id作爲key,而對象作爲 value保存的)。一級緩存的作用範圍是SqlSession範圍的,當一個SqlSession中執行兩次相同的sql第一次執行完就會將數據庫查詢到的數據寫進緩存,第二次查詢時直接去緩存中查找,從而提高數據庫的效率。
(2)如果SqlSession執行DML(insert,update,delete)操作,並且提交到數據庫,Mybatis會清空SqlSession的一級緩存,這樣做的目的是爲了保存最新的數據,避免出現髒讀的現象。當Mybatis會清空SqlSession的一級緩存(生命週期結束)
(3)SqlSession對象中會有一個Executor對象,Executor對象中持有一個PerpetualCache對象,見下面代碼。當會話結束時,SqlSession對象及其內部的Executor對象還有PerpetualCache對象也一併釋放掉。

protected BaseExecutor(Configuration configuration, Transaction transaction) {
this.transaction = transaction;
this.deferredLoads = new ConcurrentLinkedQueue<DeferredLoad>();
this.localCache = new PerpetualCache("LocalCache");
this.localOutputParameterCache = new PerpetualCache("LocalOutputParameterCache");
this.closed = false;
this.configuration = configuration;
this.wrapper = this;
}

a.如果SqlSession調用了close()方法,會釋放掉以及緩存PerpetualCache,一級緩存將不可用;
b.如果SqlSession調用了clearCache(),會清空PerpetualCache對象中的數據,但是該對象仍可使用;
c.SqlSession中執行了任何一個更新操作,例如:update、delete、insert ,都會清空PerpetualCache對象的數據,但是該對象可以繼續使用;

二.二級緩存有過期時間,但是沒有後臺線程檢測
(1)二級緩存是mapper級別的緩存,使用二級緩存時,多個SqlSession使用同一個mapper的sql語句去操作數據庫,得到的數據存在二級緩存區域。同樣是使用hashMap進行存儲。
(2)相比於一級緩存,二級緩存的範圍更大,多個SqlSession可以共用二級緩存,二級緩存時跨SqlSession的。
(3)二級緩存是多個SqlSession共享的,其作用域是SqlSession的namespace。Mybatis一級緩存是默認開啓的,二級緩存沒有默認開啓,需要在setting全局配置中配置開啓二級緩存。

二級緩存有過期時間,並不是key-value的過期時間,而是這個cache的過期時間,是flushInterval,意味着整個清空緩存cache,所以不需要後臺線程去定時檢測。

public class ScheduledCache implements Cache
{

    private final Cache delegate;
    protected long clearInterval;
    protected long lastClear;

    public ScheduledCache(Cache delegate)
    {
        this.delegate = delegate;
        this.clearInterval = 60 * 60 * 1000;
        this.lastClear = System.currentTimeMillis();
    }

    public void setClearInterval(long clearInterval)
    {
        this.clearInterval = clearInterval;

每當存取數據的時候,都有檢測一下cache的生命時間,默認是1小時,如果這個cache存活了一個小時,那麼將整個清空一下。

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