開源IMDG通常都提供了SPI或其他接口,供用戶自行擴展。以Hazelcast為例,我們可以用一些好玩的小工具增強其查詢、Map和后端持久化的功能。這些小工具雖然看起來很小,但功能也非常強大。

### SQL查詢
JoSQL非常簡單易用,只需幾步就可以在普通Java對象上實現SQL查詢功能,而且對標準SQL支持的還很全面呢。同時也提供了接口,我們可以自定義想要的SQL函數。

它與Hazelcast的集成方法非常簡單,就是新建一個Predicate子類。查詢時使用我們新建的這個類,Hazelcast執行時會將我們新定義的apply發送到各個結點上執行,將符合條件的數據返回并匯總,最后返回給我們。利用JoSQL對Hazelcast查詢的where過濾條件增強比較容易,但是想利用JoSQL的groupby、join和各種匯總函數對Hazelcast進行增強的話改動比較大,因為Hazelcast的設計就是進行簡單的過濾查詢,返回值都是對象。要擴展的話可能要利用Hazelcast的MapReduce和Aggregator接口。

### 堆外存儲
JDK中提供了直接申請堆外內存的方法,就是ByteBuffer.allocateDirect(),其底層調用的是Sun私有的Unsafe.allocateMemory()。因為像Hazelcast這些開源IMDG都把堆外存儲緩存數據作為商業版的主打功能之一,所以我們需要自行擴展。但是自己管理堆外內存很麻煩,涉及到空閑內存分配、回收、內存碎片等等管理問題,所以我們還是希望直接使用第三方的產品。在這一領域,目前已經有一些開源產品了:
???MapDB:嵌入式數據庫,提供文件和堆外存儲,以及ACID支持。
???DirectMemory:Apache旗下的開源項目,目前還是0.3版本。
???其他:HugeCollections、Fast-serialization等。
以MapDB為例,看一下它的使用方法。具體與Hazelcast的集成方法稍稍麻煩一些,需要實現三個Hazelcast的類,可以參考GitHub上的項目:Hugecast和mapdb-hz-offheap。

### 后端持久化
使用IMDG時,我們通常還要為每個對象的緩存提供數據加載和持久化類,從而實現緩存的初始化加載和read/write-through功能。可以簡單地使用JDBC+DozerMap實現數據的加載保存和實體對象裝配,或者利用Hibernate簡化這個過程。每種IMDG都提供了對應的擴展接口,例如Hazelcast的擴展點是MapLoader或MapStore,具體實現方式很簡單就不列舉了。