Как реализовать кэширование гуавы в Dropwizard? - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь настроить кеш с помощью guava, используя следующий код:

private List<Profile> buildCache() {
        LoadingCache cache = CacheBuilder.newBuilder()
                .expireAfterWrite(10, TimeUnit.MINUTES)
                .maximumSize(40)
                .build(
                        new CacheLoader<Profile, List<Profile>>() {
                            @Override
                            public List<Profile> load(Profile profile) throws Exception {
                                Profile profile1 = new Profile();
                                Profile.setEmployed(true);
                                return profileDAO.getAllProfiles(Profile1, null);
                            }
                        }
                );
        return (List<Profile>) cache;
    }


public List<Profile> getAllProfiles(Profile profile, Integer size) throws Exception {
        return profileDAO.getAllProfiles(profile, size);
    }

Идея в том, что это создаст кеш с использованием профиля get all.Метод для этого использует новый объект профиля, чтобы установить логическое значение, является ли этот сотрудник занятым или нет.Переменная размера означает, что метод вернет столько, сколько указано.Когда значение равно нулю, по умолчанию используется верхняя часть 10.

У меня есть две проблемы: 1. Я впервые использую кеш, поэтому я действительно не знаю, правильно ли я это делаю.2. Я не могу найти ничего в документации о том, как реализовать это в моем приложении.Как мне это назвать?Я попытался изменить метод getAllProfiles, чтобы он возвращался:

public List<Profile> getAllProfiles(Profile profile, Integer size) throws Exception {
        return buildCache();
    }

Но это просто возвращает исключение, из-за которого я не могу преобразовать кеш в список java:

Exception occurred: java.lang.ClassCastException: com.google.common.cache.LocalCache$LocalLoadingCache cannot be cast to java.util.List

Если это поможет,мое приложение также использует Spring, поэтому я также проводил исследования в этом направлении.Есть ли какая-то разница между springframework.cache.guava и google.common.cache, или это просто встроенный кеш в Spring?

1 Ответ

0 голосов
/ 18 мая 2018

Хорошо, я думаю, мне удалось выяснить это:

private LoadingCache<Integer, List<Profile>> loadingCache = CacheBuilder.newBuilder()
            .refreshAfterWrite(10,TimeUnit.MINUTES)
            .maximumSize(100).build(
            new CacheLoader<Integer, List<Profile>>() {
                @Override
                public List<Profile> load(Integer integer) throws Exception {
                    Profile profile= new Profile();
                    if (integer == null) {
                        integer = 10;
                    }
                    return profileDAO.getAllProfiles(profile, integer);
                }
            }
    );

Сначала я должен был указать ключ и значение, передаваемые в LoadingCache, в данном случае, Integer и List of Profile.Кроме того, когда я объявил новый CacheLoader в функции сборки, я должен был сохранить это расположение ключа и значения.Наконец, при вызове метода getAll я должен был загрузить с помощью ключа Integer, а не объекта профиля.

Что касается вызова функции:

public List<Profile> getAllProfiles(Profile profile, Integer size) throws Exception {
        return loadingCache.get(size);
    }

Это служит для получения списков определенныхчасти, которые хранятся в кэше.Если список такой длины отсутствует в кэше, метод getAll будет запущен, используя размер, который вы передаете ему.

@ Евгений, Спасибо за вашу помощь.Ваше объяснение метода загрузки действительно помогло мне представить кэш в перспективе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...