Guava Cache: как обрабатывать нулевые значения - PullRequest
0 голосов
/ 14 сентября 2018

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

private ProfileDAO profileDAO;
private String[] temp;
    private LoadingCache<String, List<Profile>> loadingCache = CacheBuilder.newBuilder()
            .refreshAfterWrite(5, TimeUnit.MINUTES)
            .expireAfterWrite(5, TimeUnit.MINUTES)
            .build(
                    new CacheLoader<String, List<Profile>>() {
                        @Override
                        public List<Profile> load(String key) throws Exception {
                            logger.info("Running method to retrieve from database");
                            temp = key.split("\\|");
                            String instance = temp[0];
                            String name = temp[1];
List<Profile> profiles= profileDAO.getProfileByFields(id, name);
                            if (profiles.isEmpty()) {
                                List<Profile> nullValue = new ArrayList<Profile>();
                                logger.info("Unable to find a value.");
                                return nullValue;
                            }
                            logger.info("Found a value");
                            return profileDAO.getProfileByFields(id, name);
                        }
                    }
            );

public List<Profile> getProfileByFields(String id, String name) throws Exception {
        String key = id.toLowerCase() + "|" + name.toLowerCase()
        return loadingCache.get(key);
    }

Это работает нормально, но не учитывает нольценности.Если я ищу запись, которая не существует, я получаю исключение для:

com.google.common.cache.CacheLoader$InvalidCacheLoadException: CacheLoader returned null for key A01|Peter

Я хотел бы просто вернуть пустой список (профиль), если в базе данных нет совпадений, но мойесли заявление не удалось.Есть ли способ обойти эту ошибку для этого конкретного случая использования?

1 Ответ

0 голосов
/ 23 сентября 2018

Внесите изменения в свой код, чтобы проверить, что первые профили имеют нулевое значение или нет (с использованием профилей == null ...):

private ProfileDAO profileDAO;
private String[] temp;
    private LoadingCache<String, List<Profile>> loadingCache = CacheBuilder.newBuilder()
            .refreshAfterWrite(5, TimeUnit.MINUTES)
            .expireAfterWrite(5, TimeUnit.MINUTES)
            .build(
                    new CacheLoader<String, List<Profile>>() {
                        @Override
                        public List<Profile> load(String key) throws Exception {
                            logger.info("Running method to retrieve from database");
                            temp = key.split("\\|");
                            String instance = temp[0];
                            String name = temp[1];
List<Profile> profiles= profileDAO.getProfileByFields(id, name);
                            if (profiles == null || profiles.isEmpty()) {
                                List<Profile> nullValue = new ArrayList<Profile>();
                                logger.info("Unable to find a value.");
                                return nullValue;
                            }
                            logger.info("Found a value");
                            return profileDAO.getProfileByFields(id, name);
                        }
                    }
            );

public List<Profile> getProfileByFields(String id, String name) throws Exception {
        String key = id.toLowerCase() + "|" + name.toLowerCase()
        return loadingCache.get(key);
    }

Пожалуйста, убедитесь, что этот код работает для нулевых значений или нет..

...