開發中使用到了緩存,用於將數據庫中的數據保存到內存中,然後在查詢的時候直接從內存中查出,而不用去連接數據庫,從而提高效率。
我將緩存設計成了一個map,用於存儲實體對象,key是這個類的id,value則是這個實體對象的引用。
public class Cache {
public static Map<String,BaseBO> cmCacheMap = new HashMap<String, BaseBO>();
}
然後在程序中直接使用這個緩存集合,對其進行增刪改查操作,如:
Cache.cmCacheMap.put('key',new BaseBO);
但是在測試的時候,卻出現了一些奇怪的問題,這個集合變成了null...(客戶端代碼不小心將這個集合賦成了null)
重新審查代碼之後,將緩存處理類改成了如下形式:
public class Cache {
private static final Map<String,BaseBO> cmCacheMap = new HashMap<String, BaseBO>();
private final static String SIGN_STRING = "-";
/**
* 設置緩存
*
*/
public synchronized static void put(String id ,BaseBO bo) {
cmCacheMap.put(bo.getId(), bo);
}
/**
* 設置全部緩存
*
*/
public synchronized static void putAllBaseBOs(Map<String,BaseBO> map) {
if(map != null) {
Cache.cmCacheMap.putAll(map);
}
}
/**
* 清除緩存
*/
public synchronized static boolean remove(String id) {
if (null != Cache.cmCacheMap.remove(id)) {
return true;
} else {
return false;
}
}
}
將緩存集合改成private,final的,不可以更改其引用地址,而且又緩存類提供接口供程序調用。
這樣做的好處:緩存集合對於外界是不可見的,可以避免被其他程序更改引用、同時如果今後想修改緩存的實現,如:使用文件形式,則可以繼續使用現在提供的接口,不用修改客戶端的代碼。
注意:對於處理緩存的方法要是線程安全的。