使用 JCache 实现保存条目顺序
Save order of entries with JCache implementation
我想将内容缓存在 table 数据库中,如下所示,在 JavaEE 应用程序服务器的 Java 堆上。
| 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实现配置acceptable。)
编辑
这是我现在正在处理的遗留企业应用程序中的一个典型的 One True Lookup Table (OTLT)。主要排序键为 group
,次要排序键为 key
.
OTLT在性能上有一些劣势,所以我想使用缓存机制来应对这个劣势。
由于您需要缓存看起来像地图模型的内容,我建议您还考虑您的访问模式(即您的应用程序如何读取这些数据)。我的猜测是您需要对这些数据做两件事:
- 列出单个组中的所有可用值(例如填充 "Country" 下拉列表)
- 按组和键定位单个值(在用户的个人资料页面中显示用户的 "Country")
鉴于这些 假定的 要求,这些要求由 Cache<String, LinkedHashMap<String, String>>
结构满足。使用 group
作为缓存的键,并使用该组中所有 key
->value
映射的 LinkedHashMap<String, String>
作为缓存的值。在这种安排中,要求 1 通过在 Cache
中进行一次查找来满足,而要求 2 通过在 Cache
中进行一次查找来满足(以获得 LinkedHashMap
键->值映射)在 LinkedHashMap
中再进行一次查找。请注意,您可以使用 TreeMap
而不是 LinkedHashMap
作为缓存的值类型,基本上任何一种保持迭代顺序的映射都可以。
由于要求 1,我会避免使用 group/key 重整方案(比如使用 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
以从查找 table 中填充缓存,以及刷新缓存内容的策略(通过过期或明确逐出缓存内容)。
我想将内容缓存在 table 数据库中,如下所示,在 JavaEE 应用程序服务器的 Java 堆上。
| 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实现配置acceptable。)
编辑
这是我现在正在处理的遗留企业应用程序中的一个典型的 One True Lookup Table (OTLT)。主要排序键为 group
,次要排序键为 key
.
OTLT在性能上有一些劣势,所以我想使用缓存机制来应对这个劣势。
由于您需要缓存看起来像地图模型的内容,我建议您还考虑您的访问模式(即您的应用程序如何读取这些数据)。我的猜测是您需要对这些数据做两件事:
- 列出单个组中的所有可用值(例如填充 "Country" 下拉列表)
- 按组和键定位单个值(在用户的个人资料页面中显示用户的 "Country")
鉴于这些 假定的 要求,这些要求由 Cache<String, LinkedHashMap<String, String>>
结构满足。使用 group
作为缓存的键,并使用该组中所有 key
->value
映射的 LinkedHashMap<String, String>
作为缓存的值。在这种安排中,要求 1 通过在 Cache
中进行一次查找来满足,而要求 2 通过在 Cache
中进行一次查找来满足(以获得 LinkedHashMap
键->值映射)在 LinkedHashMap
中再进行一次查找。请注意,您可以使用 TreeMap
而不是 LinkedHashMap
作为缓存的值类型,基本上任何一种保持迭代顺序的映射都可以。
由于要求 1,我会避免使用 group/key 重整方案(比如使用 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
以从查找 table 中填充缓存,以及刷新缓存内容的策略(通过过期或明确逐出缓存内容)。