我正在为我的 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 服务的代码在没有缓存的情况下可以正常工作;按预期替换来自 DAOreturn loadingCache.get(profile)
的负载。return profileDAO.getProfileByFields(profile)
此外,当我缩短缓存的到期时间(例如,缩短到 5 毫秒)时,它会在到期后从 DAO 加载。此外,getProfileByFields 中的 System.out 运行,显示参数已传递给配置文件对象。但是,loadingCache 中的 System out 没有运行,向我表明它永远不会到达。