Запускать обновление кеша Guava при обновлении таблицы - PullRequest
0 голосов
/ 05 июня 2019

В настоящее время я делаю список клиентов из базы данных, используя ClientDAO.getClients(), и кэширую, используя guava с периодом обновления 30 минут, как показано ниже

private List<String> getClients() {
        final Supplier<List<String>> supplier = () ->  ClientDAO.getClients();
        Suppliers.memoizeWithExpiration(supplier, 30, TimeUnit.MINUTES);
        return supplier.get();
    }

У нас есть другое приложение, которое обновляет таблицу client и другое.приложение, которое читает данные из таблицы client и кэширует, как указано выше, и между этими двумя приложениями отсутствует Restful или какая-либо другая API-связь.Есть ли способ вызвать это обновление кэша всякий раз, когда обновляется соответствующая таблица client в базе данных вместо обновления в определенное время 30 минут?

1 Ответ

0 голосов
/ 07 июня 2019

Итак, из вопроса я приму:

  • есть два приложения A и B
  • есть таблица клиента - назовем ее table X
  • A читает и кэширует данные из table X
  • B записывает данные в table X

A необходимо знать, когда B записал в table X, чтобы A мог обновить свои кэшированные данные.

вариант 1

Если вы управляете A и B, вы можете расширить поведение - когда B пишет в базу данных и запись успешна, B запускает событие в A (например, вызывает конечную точку REST) ​​и A будет знать, как обновить свой кэш.

вариант 2

Если вы не можете контролировать B, но вы можете контролировать A и DB, вы можете использовать DB в качестве точки интеграции - это обычный подход для устаревших приложений - DB единственное место, где приложения могут интегрироваться.

Итак, снова вы можете применить ту же концепцию B, которая запускает событие в A, но на этот раз событие (инициируемое триггером) сохраняется в таблице в DB и вызов REST выполняется из самой БД с использованием внутренней процедуры.

Прямой подход:

  • B записывает данные в table X
  • есть insert trigger для table X, который выполняет один оператор INSERT в таблице хранения событий (назовем его UPDATE_CACHE_EVENT)

Ваш "update_cache_event" теперь запущен (например, сохранен в этой таблице), и с этого момента у вас есть больше возможностей:

  • A может отслеживать эту таблицу каждую секунду и запускать обновление кеша при записи нового события

  • A предоставляет API REST, который вызывается из DB - например, на сервере SQL напишите процедуру, которая контролирует таблицу UPDATE_CACHE_EVENT и вызывает REST API A.

Некоторые мысли:

  • не используйте сам триггер для вызова внешнего API, используйте для этого специальную процедуру
  • триггер имеет снижение производительности (например, каждая запись в table X вызовет другую вставку в таблицу событий), поэтому вы должны учитывать это при разработке вашего решения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...