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 (知道加载缓存对象不能是 Map 类型的事实)

如果这不是使用 LoadingCache 的正确实现方式,那么如何将数据注入到 LoadingCache 的 Component 中,使其可以用作 Cache。

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 回答