我想在JavaEE应用服务器的Java堆上将内容缓存在DB表中,如下所示。
| group | key | value |
| ------- | ------- | -------------------------------------- |
| CHAR(3) | CHAR(5) | VARCHAR(256) |
| ------- | ------- | -------------------------------------- |
| 001 | 0 | male |
| 001 | 1 | female |
| 001 | 9 | other |
| 002 | 004 | Afghanistan |
| 002 | 008 | Albania |
| 002 | 010 | Antarctica |
| 002 | 012 | Algeria |
| ... | ... | ... |
| 003 | LAX | Los Angeles International Airport |
| 003 | SIN | Singapore Changi International Airport |
| ... | ... | ... |
我认为JCache是用于这些目的的最通用方式,但是如何将这些记录的顺序保存在缓存中,如LinkedHashMap?
(特定JCache实现的配置是可以接受的。)
修改
这是我正在开发的传统企业应用程序中的典型One True Lookup Table(OTLT)。主要排序键为group
,次要排序键为key
。
OTLT在性能上有一些缺点,所以我想使用use cache机制来对付这个缺点。
答案 0 :(得分:1)
由于您需要缓存看起来像地图的地图模型,我建议您还考虑您的访问模式(即您的应用程序如何读取这些数据)。我的猜测是你需要对这些数据做两件事:
鉴于这些假定的要求,这些要求以Cache<String, LinkedHashMap<String, String>>
结构实现。使用group
作为缓存的密钥,并将该组中所有LinkedHashMap<String, String>
- &gt; key
映射的value
用作缓存的值。在此安排中,通过Cache
中的单个查找来满足要求1,而在Cache
中通过一次查找来满足要求2(以获得LinkedHashMap
key-&gt;值映射)并在LinkedHashMap
中再查找一次。请注意,代替LinkedHashMap
作为缓存的值类型,您可以使用TreeMap
,基本上任何类型的维护迭代顺序的地图都可以。
由于要求1,我会避免使用组/密钥修改方案(比如使用group + "-" + key
作为缓存密钥),因为它需要完整迭代缓存的条目集(使用Cache.iterator()
)和模式匹配每个键,以确定它是否属于您正在寻找的组。
使用上述配置创建此类Cache
的JCache标准方法将是这样的:
MutableConfiguration<String, LinkedHashMap> config = new MutableConfiguration<String, LinkedHashMap>()
.setTypes(String.class, LinkedHashMap.class);
CachingProvider provider = Caching.getCachingProvider();
CacheManager defaultCacheManager = provider.getCacheManager();
Cache<String, LinkedHashMap> cache = defaultCacheManager
.createCache("cache", config);
观察到由于Java泛型限制,无法执行此操作:
MutableConfiguration<String, LinkedHashMap<String, String>> config = new MutableConfiguration<String, LinkedHashMap<String, String>()
.setTypes(String.class, LinkedHashMap<String, String>.class);
此外,您可以考虑实施CacheLoader
以从查找表中填充缓存,以及刷新缓存内容的策略(通过到期或明确驱逐缓存内容)。