Метод, возвращающий результаты кеша вместо перехода в базу данных - PullRequest
0 голосов
/ 25 мая 2018

Я использую кеш guava для моих методов get.Я заметил, что один из моих методов, который извлекает информацию профиля из базы данных на основе имени и отдела, возвращает ТОЛЬКО из кэша.Если запись не находится в кэше, она должна пойти в DAO для получения этого профиля из базы данных.В моем случае это просто возврат последней записи, помещенной в кеш.

Вот мой код для кеша и метод уровня менеджера, который его использует:

private LoadingCache<Profile, List<Profile>> loadingCache = CacheBuilder.newBuilder()
            .refreshAfterWrite(5, TimeUnit.MINUTES)
            .expireAfterAccess(5, TimeUnit.MINUTES)
            .maximumSize(100).build(
                    new CacheLoader<Profile, List<Profile>>() {
                        @Override
                        public List<Profile> load(Profile profile) throws Exception {
                            System.out.println("Profile Parameters in LoadCache= " + profile);
                            return profileDAO.getProfileByFields(profile);
                        }
                    }
            );

public List<Profile> getProfileByFields(Profile profile) throws Exception {
        System.out.println("Profile Parameters in method= " + profile);
        return loadingCache.get(profile);
    }

Способ, которым этоработает на том, что на сервисном уровне метод get вызывается с именем профиля и отделом в параметрах пути:

@GET
@Path("{name}/{department}")
public List<Profile> getProfileByFieldsService(@PathParam("name") String name, @PathParam("department") String department) {
    Profile profile = new Profile();
    profile.setName(name);
    profile.setDepartment(department);
    //code to get data here.
}

Эти параметры передаются менеджеру, который должен загружаться либо из кэша, либо изDAO.Я знаю код службы DAO, который работает правильно без кеша;замена return loadingCache.get(profile) на return profileDAO.getProfileByFields(profile) загрузки из DAO, как и ожидалось.Кроме того, когда я сокращаю срок действия кэша (скажем, до 5 миллисекунд), он загружается из DAO после истечения срока действия.Кроме того, System.out в getProfileByFields запускается, показывая, что параметры передаются объекту профиля.Тем не менее, System out в loadingCache не запускается, что указывает на то, что оно никогда не достигается.

...