import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
+import java.util.HashMap;
import java.util.Objects;
public class KeyValueStore {
private static final Logger logger = LoggerFactory.getLogger(KeyValueStore.class);
private final Database database;
+ private final HashMap<KeyValueEntry<?>, Object> cache = new HashMap<>();
public static void createSql(Connection connection) throws SQLException {
// When modifying the CREATE statement here, also add a migration in AccountDatabase.java
this.database = database;
}
+ @SuppressWarnings("unchecked")
public <T> T getEntry(KeyValueEntry<T> key) {
+ synchronized (cache) {
+ if (cache.containsKey(key)) {
+ logger.trace("Got entry for key {} from cache", key.key());
+ return (T) cache.get(key);
+ }
+ }
try (final var connection = database.getConnection()) {
return getEntry(connection, key);
} catch (SQLException e) {
try (final var statement = connection.prepareStatement(sql)) {
statement.setString(1, key.key());
- final var result = Utils.executeQueryForOptional(statement,
- resultSet -> readValueFromResultSet(key, resultSet)).orElse(null);
+ var result = Utils.executeQueryForOptional(statement, resultSet -> readValueFromResultSet(key, resultSet))
+ .orElse(null);
if (result == null) {
- return key.defaultValue();
+ logger.trace("Got entry for key {} from default value", key.key());
+ result = key.defaultValue();
+ } else {
+ logger.trace("Got entry for key {} from db", key.key());
+ }
+ synchronized (cache) {
+ cache.put(key, result);
}
return result;
}
setParameterValue(statement, 2, key.clazz(), value);
statement.executeUpdate();
}
+ synchronized (cache) {
+ cache.put(key, value);
+ }
return true;
}