0

SOに関するCCEの質問がかなりあることは知っています。それらの大部分を詳細または簡単に読みましたが、私の状況に当てはまるものは何も見つかりません. 私の正確なエラーは次のとおりです。

Exception in thread "pool-1-thread-1" java.lang.ClassCastException: datastructures.instances.JClass cannot be cast to java.util.ArrayListif ((results = mCallsDownstreamCache.get(origin)) == null) {

コードでわかるようにArrayList、キャッシュ ( HashMap) から を要求し、それについて決定を下しています。ここでの奇妙な動作は、エラーを生成するコードでdatastructures.instances.JClassまったく参照されていないことです。

コンテキストを提供するために、「コントローラー」からの要求を満たすデータベース「モデル」があります。これらの結果はモデルのローカルのキャッシュに保存され、存在する場合、モデルはキャッシュを返すため、データベースにアクセスする必要はありません。私のキャッシング要素は事実上、Commons の JCSのデコレーターです。

問題のある行はblock commentandで囲まれていますinline comment

public class AnalyzeModel extends Model {

    public final String TAG = getClass().getSimpleName();
    public CacheDecorator<Integer, JClass> mClassCache = new CacheDecorator<Integer, JClass>();
    public CacheDecorator<Integer, JMethod> mMethodCache = new CacheDecorator<Integer, JMethod>();
    public CacheDecorator<Integer, ArrayList<Integer>> mCallsUpstreamCache =
            new CacheDecorator<Integer, ArrayList<Integer>>();
    public CacheDecorator<Integer, ArrayList<Integer>> mCallsDownstreamCache =
            new CacheDecorator<Integer, ArrayList<Integer>>();

    public void close() {
        super.close();
    }

    public Pair<Integer, ArrayList<Integer>> selectCallGraphDownstream(int origin) {
        ArrayList<Integer> results = new ArrayList<Integer>();

        /**
         * This is the offending line
         */
        if ((results = mCallsDownstreamCache.get(origin)) == null) {
        // End error line
            results = new ArrayList<Integer>();
            for (Record r : mQuery.select(
                    mQuery.mQuerier.select(Calls.CALLS.TID)
                            .from(Calls.CALLS)
                            .where(Calls.CALLS.SID.eq(origin)))) {
                results.add(r.getValue(Calls.CALLS.TID));
            }
            mCallsDownstreamCache.put(origin, results);
            Statistics.CACHE_MISS++;
        } else {
            Statistics.CACHE_HITS++;
        }
        return new Pair<Integer, ArrayList<Integer>>(origin, results);
    }

}

public class CacheDecorator<K, V> {

    public final String TAG = getClass().getSimpleName();

    private CacheAccess<K, V> mCache;

    public CacheDecorator() {
        try {
            mCache = JCS.getInstance("default");
        } catch (CacheException e) {
            BillBoard.e(TAG, "Error getting cache configuration: " + e.toString());
            e.printStackTrace();
        }
    }

    /**
     * Get an object from cache
     * @param obj object to retrieve from cache
     * @return generic object of retrieved value, null if not found
     */
    public V get(K obj) {
        return mCache.get(obj);
    }

    /**
     * Place an object in cache
     * @param key generic key for reference
     * @param obj generic object to be cached
     */
    public synchronized void put(K key, V obj) {
        try {
            if(obj != null) {
                mCache.putSafe(key, obj);
            }
        } catch( CacheException e) {
            //BillBoard.d(TAG, obj.toString());
            //BillBoard.e(TAG, "Error placing item in cache: " + e.toString());
            //e.printStackTrace();
        }
    }

    /**
     * Get the stats from our cache manager
     * @return String of our cache object
     */
    public String getStats() {
        shutDownCache();
        return mCache.getStats();
    }

    public static void shutDownCache() {
        CompositeCacheManager.getInstance().shutDown();
    }
}

役に立つかもしれないし、役に立たないかもしれないいくつかの追加の詳細:

  • データ構造は不変の 2 ペアのPair<V, K>タプル クラスです。
  • CacheDecorator.get(V obj)nullオブジェクトがキャッシュに存在しない場合に返されます
  • 私はキャストなどに関してかなり試しました
  • JClassコードの他の場所に参照がありますが、問題のあるメソッドには参照がありません
  • JClassはJavaクラスの表現であり、カスタム構造です
4

1 に答える 1

1

ドキュメントに示されているように、構成を変更して地域固有の構成を含め、地域をラッパーに渡すことで、問題を解決できます。

すべてのラッパーに同じキャッシュ領域を使用しているため、ラッパー全体で同じ「敷設キャッシュ」を参照しているようです。すべてのラッパーのmCache = JCS.getInstance("default");ようなものに変更できますか?mCache = JCS.getInstance("uniqueNameForWrapper");

于 2015-06-09T00:22:30.047 に答える