RanPaul:
我々は方法の下に持ってHeartBeat
5分のために以下のように更新すると、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();
}