Guava 11: кеш не работает с 5-минутным обновлением - PullRequest
1 голос
/ 10 июня 2019

У нас есть метод ниже в потоке HeartBeat, который выполняется каждые 30 секунд, мы ввели кеш Guava с 5-минутным обновлением, как показано ниже для ClientsDAO.getClients(), чтобы мы не обращались к базе данных каждые 30 секунд.

private List<String> getClients() {
        final Supplier<List<String>> supplier = () ->  ClientsDAO.getClients();
        if(Server.CACHE_REFRESH_DURATION <=0)
            return supplier.get();
        else{
        LOG.debug("Fetching Clients from cache, duration = "+Server.CACHE_REFRESH_DURATION+". timeunit = "+Server.CACHE_REFRESH_TIMEUNIT);  
        return Suppliers.memoizeWithExpiration(supplier, Server.CACHE_REFRESH_DURATION, Server.CACHE_REFRESH_TIMEUNIT).get();
        }       
    }

Как видно из журнала ниже, каждый раз, когда поток HeartBeat выполняет попадание в базу данных, а не извлекает его из кэша. Может кто-нибудь, пожалуйста, помогите мне это исправить?

[Jun 10 10:16:05] pool-16-thread-1 | DEBUG | com.server.Heartbeat | Fetching Clients from cache, duration = 5. timeunit = MINUTES
[Jun 10 10:16:05] pool-16-thread-1 | DEBUG | com.server.ClientsDAO | Getting DB connection
[Jun 10 10:16:05] pool-16-thread-1 | DEBUG | com.server.ClientsDAO | Queried for Clients

[Jun 10 10:16:35] pool-16-thread-1 | DEBUG | com.server.Heartbeat | Fetching Clients from cache, duration = 5. timeunit = MINUTES
[Jun 10 10:16:35] pool-16-thread-1 | DEBUG | com.server.ClientsDAO | Getting DB connection
[Jun 10 10:16:35] pool-16-thread-1 | DEBUG | com.server.ClientsDAO | Queried for Clients

[Jun 10 10:17:05] pool-16-thread-1 | DEBUG | com.server.Heartbeat | Fetching Clients from cache, duration = 5. timeunit = MINUTES
[Jun 10 10:17:05] pool-16-thread-1 | DEBUG | com.server.ClientsDAO | Getting DB connection
[Jun 10 10:17:05] pool-16-thread-1 | DEBUG | com.server.ClientsDAO | Queried for Clients

1 Ответ

5 голосов
/ 10 июня 2019

Вы никогда не используете повторно Suppliers.memoizeWithExpiration, поэтому это всегда новый вызов

Вы создаете нового поставщика уведомлений при каждом вызове, поэтому вы в основном делаете новый вызов каждый раз, потому что новый поставщик уведомлений пуст и, следовательно, передает вызов для его заполнения. Вы должны создать поставщика заметок только один раз и повторно вызывать его так:

private final Supplier<List<Client>> getClientsSupplier = Suppliers.memoizeWithExpiration(ClientsDao::getClients, Server.CACHE_REFRESH_DURATION, Server.CACHE_REFRESH_TIMEUNIT);

public List<Client> getClients() {
  return getClientsSupplier.get();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...