我有一个包含 3 列id
(int)、name
(varchar)和display
(varchar)的 SQL 表“Stats”。在我的程序中,我想在需要时缓存从该表中提取的信息,所以我使用的是 guava 的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;
}
}
有没有办法可以在不同的键下获取缓存中的值?我应该使用两个缓存,一个用于 by id
,一个用于 by name
?如果是这样,如果表在外部发生变化,我如何保持这两个同步?
如果有人可以让我知道一个更好的方法来解决这个问题,那就太好了,谢谢!