3

Google guava 11.0 ライブラリで導入された loadAll メソッドの効果的な実装方法を知りたいです。


これは、 CachesExplained の例に従って拡張されたすべてのメソッドの実装をロードすることを説明する次のコードです。

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder().maximumSize(1000)
.refreshAfterWrite(1, TimeUnit.MINUTES)
.build(
   new CacheLoader<Key, Graph>() {
     public Graph load(Key key) { // no checked exception
       return getGraphFromDatabase(key);
     }

     public Map<Key, Graph> loadAll(Iterable<? extends K> keys) {
         return getAllGraphsFromDatabase(keys);
     }
   }
);

private Map<Key, Graph> getAllGraphsFromDatabase(Iterable<? extends key> keys)
{
  lListOfGraph = //resultset got from DB Call
  for (lCount = 0; lCount < lListOfGraph.size(); lCount++)
  {
     lGraph = (Graph)lListOfGraph.get(lCount).get(0);
     graphs.asMap().put((key , lGraph);
  }
  return (Map<key, Graph>) graphs;
}

ここで戻り値の型が Map である場合、エラー java.lang.ClassCastException:com.google.common.cache.LocalCache$LocalLoadingCache を java.util.Map にキャストできません (Loading Cache オブジェクトを Map 型にすることはできないという事実を認識しています)

これが LoadingCache を使用する実装の正しい方法でない場合、データを LoadingCache のコンポーネントに挿入してキャッシュとして使用できるようにする方法を教えてください。

4

1 に答える 1

5

メソッドgetAllGraphsFromDatabaseは、基になるデータ ストアから値を取得する必要があります。実装はLoadingCache、返された値をマップに追加する処理を行います。

読み込み方法は次のようになるはずです。

private Map<Key, Graph> getAllGraphsFromDatabase(Iterable<? extends key> keys)
{
  final List<Graph> lListOfGraph = //resultset got from DB Call

  final Map<Key, Graph> map = new HashMap<Key, Graph>(listOfGraph.size());
  for (final Graph graph : lListOfGraph)
    map.put(graph.getKey(), graph);

  return map;
}
于 2012-08-03T11:13:55.007 に答える