Google Guava的CacheLoader loadAll()方法实现问题
我有兴趣知道google guava 11.0库中引入的loadAll方法实现的有效方法是什么。
以下是描述加载所有扩展方法实现的代码
根据CachesExplained的示例
LoadingCache graphs = CacheBuilder.newBuilder().maximumSize(1000) .refreshAfterWrite(1, TimeUnit.MINUTES) .build( new CacheLoader() { public Graph load(Key key) { // no checked exception return getGraphFromDatabase(key); } public Map loadAll(Iterable keys) { return getAllGraphsFromDatabase(keys); } } ); private Map getAllGraphsFromDatabase(Iterable 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) graphs; }
这里返回类型是Map throws error java.lang.ClassCastException:com.google.common.cache.LocalCache $ LocalLoadingCache不能转换为java.util.Map(知道加载Cache对象不能是Map类型的事实)
如果这不是使用LoadingCache的正确实现方式,那么如何在LoadingCache的Component中注入数据,以便它可以用作Cache。
您的getAllGraphsFromDatabase
方法应该从底层数据存储中获取值。 LoadingCache
实现处理将返回的值添加到地图中。
我认为你的加载方法应如下所示:
private Map getAllGraphsFromDatabase(Iterable extends key> keys) { final List lListOfGraph = //resultset got from DB Call final Map map = new HashMap(listOfGraph.size()); for (final Graph graph : lListOfGraph) map.put(graph.getKey(), graph); return map; }