开发中使用到了缓存,用于将数据库中的数据保存到内存中,然后在查询的时候直接从内存中查出,而不用去连接数据库,从而提高效率。
我将缓存设计成了一个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的,不可以更改其引用地址,而且又缓存类提供接口供程序调用。
这样做的好处:缓存集合对于外界是不可见的,可以避免被其他程序更改引用、同时如果今后想修改缓存的实现,如:使用文件形式,则可以继续使用现在提供的接口,不用修改客户端的代码。
注意:对于处理缓存的方法要是线程安全的。