- Założenia:
- Przypadki:
- z danej listy wartości korzysta jednocześnie wielu użytkowników.
- Zysk:
- nie musimy trzymać wartości, gdy są już niepotrzebne (beany sesyjne itp.).
Jak:
Tworzymy singleton, w którym przechowujemy wartości. Określamy czas, przez jaki wartości mają być trzymane w pamięci.
Propozycja rozwiązania: Użyjemy biblioteki guava.
Teoria:
https://github.com/google/guava/wiki/CachesExplained
Praktyka:
- definiujemy zmienną, w której będziemy przechowywać dane:
- LoadingCache<Key, Graph> cache;
Przykład:
klucz - id oddziału, wartość - lista pracowników
LoadingCache<Long, List<Employee>> cache;
- definiujemy cacheLoader'a:
private CacheLoader makeCacheLoader(){
return new CacheLoader<Long, List<Employee>>(){
@Override
public List<Employee> load(Long departmentId){
return getFromDatabase(departmentId);
}
};
}
return new CacheLoader<Long, List<Employee>>(){
@Override
public List<Employee> load(Long departmentId){
return getFromDatabase(departmentId);
}
};
}
i metodę, pobierającą dane z bazy:
public List<Employee> getFromDatabase(Long departmentId){...}
- dodajemy (np. w metodzie oznaczonej @PostConstruct):
cache = CacheBuilder.newBuilder()
.maximumSize(100)
.expireAfterAccess(30, TimeUnit.MINUTES)
.build( makeCacheLoader());
- metoda, która służyć będzie do pobierania wartości:
return cache.getUnchecked(departmentsId);
}
Jako, że jest to meritum sprawy i punkt kulminacyjny naszego show, pochylmy się jeszcze raz nad przyświecającą nam ideą.
Wywołując metodę getEmployees za pierwszym razem, użytkownik pobierze dane z bazy. Dane te będą trzymane w pamięci przez 30 minut od czasu ostatniego zapisu/odczytu tych wartości z cache'a (w przypadku opcji expireAfterWrite - ostatniego zapisu tych wartości do cache'a). W tym czasie przy ponownym wywołaniu metody getEmployees dla tego samego oddziału, nie będziemy pobierać ponownie danych z bazy.
0 komentarze:
Prześlij komentarz