使用 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在性能上有一些劣势,所以我想使用缓存机制来应对这个劣势。

由于您需要缓存看起来像地图模型的内容,我建议您还考虑您的访问模式(即您的应用程序如何读取这些数据)。我的猜测是您需要对这些数据做两件事:

  1. 列出单个组中的所有可用值(例如填充 "Country" 下拉列表)
  2. 按组和键定位单个值(在用户的个人资料页面中显示用户的 "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 中填充缓存,以及刷新缓存内容的策略(通过过期或明确逐出缓存内容)。