Я использую кеш 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 не запускается, что указывает на то, что оно никогда не достигается.