使用JCache实现保存条目的顺序

时间:2017-12-07 16:39:38

标签: java jcache

我想在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机制来对付这个缺点。

1 个答案:

答案 0 :(得分:1)

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

  1. 列出单个组中可用的所有值(例如,填充“国家/地区”下拉列表)
  2. 按组和键找到单个值(在其个人资料页面中显示用户的“国家/地区”)
  3. 鉴于这些假定的要求,这些要求以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以从查找表中填充缓存,以及刷新缓存内容的策略(通过到期或明确驱逐缓存内容)。