大家好: 用SoftReference  和static HashMap 做了一个全局的缓存。实现后发现没有做到全局缓存,换个用户登录后缓存就不起作用了。下面是代码,各位兄弟帮忙指点一下。谢谢了!CacheManagerV2 类public class CacheManagerV2{
private static HashMap cacheMap = new HashMap();
private static final CacheManagerV2 instance = new CacheManagerV2();
private static Object lock = new Object();

private CacheManagerV2() {
}
public static synchronized CacheManagerV2 getInstance() {
return instance;
}
// 判断是否存在一个缓存  
public static synchronized boolean hasCache(String key) {
return cacheMap.containsKey(key);
}
//获取缓存信息  
public Object getCacheInfo(String key) {
if (hasCache(key)) {
return ((SoftReference)cacheMap.get(key)).get();
} else
return null;
}
//载入缓存信息
public static synchronized void putCacheInfo(String key, Object obj) {
SoftReference softRef = new SoftReference(obj);
obj = null;
cacheMap.put(key, softRef);
}
CacheObjectManager 类public class CacheObjectManager {
public static Object getCache(String key,AbstractMDMCacheV2 object) throws MDMException{
Object obj = CacheManagerV2.getInstance().getCacheInfo(key);
if(null == obj){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
obj = object.getObjectCommand();
CacheManagerV2.putCacheInfo(key, obj);
}
return obj;
}
}AbstractMDMCacheV2是个抽象类,有抽象方法getObjectCommand,继承的类实现具体的取数操作下面是调用String sort = "VWINIT";
GetRecordsByKeysCacheCommand getRecordByKes = new GetRecordsByKeysCacheCommand();
getRecordByKes.setSearchKey("EPID");
getRecordByKes.setSearchValue(new String[]{sort});
BusinessPartnerDO bp = (BusinessPartnerDO)CacheObjectManager.getCache(sort,getRecordByKes);

解决方案 »

  1.   


    public class CacheManagerV2{
    private static HashMap cacheMap = new HashMap();
    // private static final CacheManagerV2 instance = new CacheManagerV2();
    private static Object lock = new Object();

    private CacheManagerV2() {
    }
    // public static synchronized CacheManagerV2 getInstance() {
    // return instance;
    // }
    // 判断是否存在一个缓存  
    public static synchronized boolean hasCache(String key) {
    return cacheMap.containsKey(key);
    }
    //获取缓存信息  
    public static Object getCacheInfo(String key) {
    if (hasCache(key)) {
    return ((SoftReference)cacheMap.get(key)).get();
    } else
    return null;
    }
    //载入缓存信息
    public static synchronized void putCacheInfo(String key, Object obj) {
    SoftReference softRef = new SoftReference(obj);
    // obj = null;
    cacheMap.put(key, softRef);
    }
    public static void clearGC(){
    System.gc();
    }
    public static void clearCache(){
    cacheMap.clear();
    }
    public static int getCacheSize(){
    return cacheMap.size();
    }
    public static HashMap getCacheHashMap(){
    return cacheMap;
    }
    }