Есть ли класс, который хранит одно значение под двумя разными ключами? - PullRequest
2 голосов
/ 15 апреля 2020

У меня есть SQL таблица «Статистика» с 3 столбцами, id (int), name (varchar) и display (varchar). В моей программе я хочу кэшировать информацию, извлеченную из этой таблицы, когда это необходимо, поэтому я использую гуаву LoadingCache.

    private static final LoadingCache<Integer, Stat> STATS = CacheBuilder.newBuilder()
        .build(new CacheLoader<Integer, Stat>() {
            @Override
            public Stat load(Integer key) throws Exception {
                try (PreparedStatement stmt = SQLProvider.get().prepareStatement(
                        "SELECT name, display FROM Stats WHERE id=?"
                )) {
                    stmt.setInt(1, key);

                    try (ResultSet rs = stmt.executeQuery()) {
                        if (!rs.next())
                            throw new IllegalArgumentException("No stat found in the Stats table with id " + key);

                        String name = rs.getString(1);
                        String display = rs.getString(2);

                        return new Stat(key, name, display);
                    }
                }
            }
        });

Однако в большинстве мест в моей программе я буду иметь только name для соответствующей характеристики, и мне нужно будет получить id и display от этого. У меня есть это решение, но я надеюсь, что есть лучший способ кеширования информации, поэтому мне не придется делать два запроса к таблице для одной статистики.

public static Stat getByName(String name) {
    try (PreparedStatement stmt = SQLProvider.get().prepareStatement(
            "SELECT id FROM Stats WHERE name=?"
    )) {
        stmt.setString(1, name);

        try (ResultSet rs = stmt.executeQuery()) {
            if (!rs.next())
                return null;

            return get(rs.getInt(1));
        }
    } catch (SQLException e) {
        e.printStackTrace();
        return null;
    }
}

Есть ли способ, которым я может получить значение в кэше под другим ключом? Должен ли я использовать два кэша, один на id и один на name? Если да, то как я могу сохранить эти два синхронизированных, если внешнее изменение таблицы?

Если бы кто-нибудь мог сообщить мне лучший способ добиться этого, это было бы здорово, спасибо!

...