У меня есть 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
? Если да, то как я могу сохранить эти два синхронизированных, если внешнее изменение таблицы?
Если бы кто-нибудь мог сообщить мне лучший способ добиться этого, это было бы здорово, спасибо!