Сохранить порядок записей с реализацией JCache

Я хочу кэшировать содержимое в таблице БД, как показано ниже, в куче Java сервера приложений JavaEE.

| 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 имеет некоторые недостатки в производительности, поэтому я хочу использовать механизм кэширования в качестве меры противодействия этим недостаткам.


person SATO Yusuke    schedule 07.12.2017    source источник
comment
порядок основан на некотором ключе. Таблица Db в собственном смысле, JChache в аналогичном. Я предполагаю, что какой-то ключ группы соединений + строка является вашим ключом JCache ???   -  person Jacek Cz    schedule 07.12.2017
comment
Пример показывает, у вас есть проблемы с типом ключа, а не строкой, а не числом... например, добавление яблок к персикам   -  person Jacek Cz    schedule 07.12.2017
comment
Как вы и сказали, эта раскладка таблицы какая-то странная. Но такие таблицы в стиле OTLT часто появляются в устаревших корпоративных приложениях. Я добавляю некоторую информацию в вопрос.   -  person SATO Yusuke    schedule 13.12.2017


Ответы (1)


Поскольку вам нужно кэшировать то, что выглядит как модель карты карт, я бы посоветовал вам также принять во внимание ваш шаблон доступа (то есть, как ваше приложение читает эти данные). Я предполагаю, что вам нужно сделать две вещи с этими данными:

  1. список всех значений, доступных в одной группе (например, для заполнения раскрывающегося списка «Страна»)
  2. найдите одно значение по группе и ключу (чтобы отобразить «Страну» пользователя на странице его профиля)

Учитывая эти предполагаемые требования, они выполняются с помощью структуры Cache<String, LinkedHashMap<String, String>>. Используйте group в качестве ключа кеша и LinkedHashMap<String, String> всех сопоставлений key->value в этой группе в качестве значения кеша. В этой схеме требование 1 выполняется с помощью одного поиска в Cache, а требование 2 выполняется с одним поиском в Cache (для получения сопоставления LinkedHashMap ключ->значение) и еще одним поиском в LinkedHashMap. Обратите внимание, что вместо LinkedHashMap в качестве типа значения кеша вы можете использовать TreeMap, практически любой тип карты, который поддерживает порядок итерации.

Из-за требования 1 я бы избегал схемы изменения группы/ключа (например, использования group + "-" + key в качестве ключа кэша), поскольку для этого потребовалась бы полная итерация набора записей кэша (с Cache.iterator()) и шаблон, соответствующий каждому из ключей, чтобы решить, является ли он принадлежит к группе, которую вы ищете, или нет.

Стандартный для JCache способ создания такого Cache с приведенной выше конфигурацией будет примерно таким:

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 для заполнения вашего кеша из таблицы поиска, а также стратегию обновления содержимого вашего кеша (либо через истечение срока действия, либо путем явного удаления содержимого кеша).

person Vassilis Bekiaris    schedule 13.12.2017