我们正在使用javaHashmap在所有TIBCO应用程序中缓存数据库表。我想知道JavaHashmap是否真的已编入索引,或者是否有更好的方法在Java中缓存数据库表(无法添加新框架)
public class WrapConvTableInfo {
private static HashMap<String, WrapConvTableInfo_Entry> _wrapConvMap;
public WrapConvTableInfo() {
_wrapConvMap = new HashMap<String, WrapConvTableInfo_Entry>();
}
以上是供参考的代码段。
答案 0 :(得分:1)
HashMap
是键值存储而不是表。这里没有索引的概念,就像数据库中的表一样;它基于散列键来工作。
每个HashMap
都包含一些名为buckets的内容。对键进行散列,并将散列值除以桶的数量。余数是您的值所在的桶号。
例如,假设我的HashMap有16个桶。
现在,如果我假设我将一个键值对<foo,bar>
插入我的HashMap
。
foo
的哈希值。出于此示例的目的,假设返回的哈希值为61。从HashMap中获取值
foo
的散列和桶号的计算类似于插入。如果您使用HashMap
进行缓存,则需要花一些时间来处理最初应该有多大的事情?您的HashMap
应该何时增长(loadFactor
)和桶的数量应该具有少量的存储桶,这将导致搜索的值太多。另一方面,太多桶会导致CPU上L1缓存的浪费。此外,如果你的应用程序是多线程的,那么 HashMap不是线程安全的,你最终会得到一个损坏的缓存。在这种情况下,您需要使用ConcurrentHashMap
。