我有兴趣知道 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的Component中是如何注入数据,使其可以作为Cache使用的。
Your 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)