0

我正在为我的 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 没有运行,向我表明它永远不会到达。

4

0 回答 0