poniedziałek, 16 maja 2016

Formatki, Cache i Guava

Zastosowanie

  • Założenia:
Aplikacja wyświetla wartości słownikowe. Zakładamy, że z aplikacji w tym samym czasie korzystać będzie wielu użytkowników.

  • Przypadki: 
 - użytkownik wchodzi, wychodzi i znowu wchodzi na daną formatkę,
 - z danej listy wartości korzysta jednocześnie wielu użytkowników.

  • Zysk:
 - za każdym razem nie musimy łączyć się z bazą,
 - 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);
                          } 
                  };
          }

          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:
          public List<Employee> getEmployees(Long departmentsId) {
                     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