グァバ11:キャッシュが5分で作業していないリフレッシュ

RanPaul:

我々は方法の下に持ってHeartBeat5分のために以下のように更新すると、30秒ごとに実行するスレッド、我々はグアバキャッシュを導入している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
オリヴィエ・グレゴワール:

あなたは再利用したことがないSuppliers.memoizeWithExpiration、それは常に新しいコールですので、

あなたは、各呼び出しで新しいmemoizingサプライヤーを作成しているので、新しいmemoizingサプライヤーが空であるため、自分自身を埋めるためにコールを伝播するので、あなたは、基本的たびに新しい電話をかけます。あなたは一度だけmemoizingサプライヤを作成し、このようにそれを繰り返し呼び出す必要があります:

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();
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=333538&siteId=1