iBATIS緩存實現分析

     爲了提高應用程序性能,一種比較通用的方法是使用緩存技術來減少與數據庫之間的交互。緩存技術是一種“以空間換時間”的設計理念,利用內存空間資源來提高數據檢索速度的有效手段之一。

     iBATIS以一種簡單、易用、靈活的方式實現了數據緩存。下面,首先看一下iBATIS關於緩存部分的核心類圖:

iBATIS緩存核心類圖

     關於這些類的用途,在註釋中做了比較概括性的說明,下面就來仔細的講一下這些類的用途以及它們是如何工作的。

     在iBATIS中,可以配置多個緩存,每個cacheModel的配置對應一個CacheModel類的一個對象。其中包括id等配置信息。iBATIS通過這些配置信息來定義緩存管理的行爲。

     緩存的目的是爲了能夠實現數據的高速檢索。在程序中,數據是用對象表示的;爲了能夠檢索到以緩存的數據對象,每個數據對象必須擁有一個唯一標識,在iBATIS中,這個唯一標識用CacheKey來表示。

     那麼,緩存的數據保存到什麼地方了呢?如何實現數據的快速檢索呢?答案在CacheController的實現類中。每個CacheController中都有一個Map類型的屬性cache來保存被緩存的數據,其中key爲CacheKey類型,value爲Object類型;需要關注的是CacheKey對象的hashCode的生成算法,每次調用CacheKey對象的update方法時,都會更新它的hashCode值,關於hashCode值的計算方法後續在給出詳細說明。

     在擁有了數據緩存區後,就可以向其中存放數據和檢索數據了。在iBATIS中,有多種的緩存管理策略,也可以自定義緩存管理策略。

     關於緩存的功能,主要有兩種類型:一種是對外提供的功能:數據存儲和數據檢索;另外一種是內部管理的功能:緩存對象標識的生成,緩存區刷新,數據檢索算法等。下面就逐一介紹這些功能的代碼實現。

     1. 數據存儲

         首先看一下CacheModel中的putObject方法是如何實現的

       因爲真正緩存數據對象的地方是在CacheController中,所以CacheModel的putObject方法中會調用CacheController的putObject方法執行真正的數據存儲。由於不同的CacheController實現的緩存管理方式不同,所以putObject實現也各不相同。下面分別介紹不同的CacheController實現的putObject方法

      1) FifoCacheController

       2)LruCacheController

      3)MemoryCacheController

      4)OSCacheController

      這個緩存管理使用了OSCache來管理緩存,這裏就不做仔細的介紹了。

     2. 數據檢索

     在數據被放置到緩存區中以後,程序需要根據一定的條件進行數據檢索。首先看一下CacheModel類的getObject方法是如何檢索數據的

    真正的數據檢索操作是在CacheController的實現類中進行的,下面就分別來看一下各個實現類是如何檢索數據的。

     1) FifoCacheController

     2) LruCacheController

     3) MemoryCacheController

   3 唯一標識的生成

      在iBATIS中,用CacheKey來標識一個緩存對象,而CacheKey通常是作爲Map中的key存在,所以CacheKey的hashCode的計算方法異常重要。影響hashCode的值有很多方面的因素,對每一個影響hashCode的元素,都需要調用CacheKey的update方法來重新計算hashCode值。下面我們就來看一下CacheKey的創建以及計算的相關過程。

      首先CacheKey是在BaseDataExchange類的getCacheKey方法中被創建的。

      這個方法被MappedStatement中的getCacheKey調用

     真正需要CacheKey對象的地方是在CacheStatement類中

    經過上述一系列的getCacheKey調用,將對CacheKey有影響的因素施加給了hashCode。其中對CacheKey的hashCode起影響作用的因素主要有:baseCacheKey,sql語句,參數值,statement id。可能產生影響的因素是session id。

    現在我們知道了決定CacheKey的相關因素,也就知道了iBATIS是如何唯一的確定一個緩存對象。

    經過以上的代碼分析,可以掌握iBatis如何生成CacheKey對象和計算其hashCode值,以及存儲和檢索數據對象。這些正是iBATIS緩存的基礎,掌握了這些實現原理,有助於我們更高效的使用iBATIS緩存功能,或者是開發自己的緩存系統。

 

 

     

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