2

我有一个包含 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对应的统计数据,我需要从中获取iddisplay。我有这个解决方案,但我希望有一种更好的方法来缓存信息,这样我就不必为一个统计信息对表进行两次查询。

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?如果是这样,如果表在外部发生变化,我如何保持这两个同步?

如果有人可以让我知道一个更好的方法来解决这个问题,那就太好了,谢谢!

4

0 回答 0