2012-05-04 33 views
8

Jak powiedział w EhCache documentation:Załaduj zawartość diskstore ehcache do pamięci

W praktyce oznacza to, że uporczywe w pamięci cache zaczną się ze wszystkimi jego elementami na dysku. [...] Tak więc, projekt Ehcache nie ładuje ich wszystkich do pamięci podczas uruchamiania, ale leniwie ładuje je w razie potrzeby.

Chciałbym, aby pamięć podręczna pamięci podręcznej została uruchomiona w pamięci wszystkich jego elementów, w jaki sposób mogę to osiągnąć?

Powodem tego jest fakt, że nasza strona internetowa wykonuje lot dostępu do pamięci podręcznej, więc po raz pierwszy odwiedzamy stronę internetową, która ma bardzo zły czas odpowiedzi.

+0

można iterację wszystkich wpisów na starcie? –

+0

To właśnie robię obecnie, ale sposób, w jaki to robi jest bardzo powolny (ja nazywam metody wysokiego poziomu w pętlach, a te metody wysokiego poziomu również wywołują zapytania DB). Jeśli istnieje sposób na iterację po prostu na wszystkich wpisach bezpośrednio z EhCache API, może to być dobre. –

Odpowiedz

4

Zakładam, że wszystkie zbuforowane elementy znajdują się w magazynie DiskStore i chcesz, aby były zapisane w pamięci zaraz po uruchomieniu aplikacji. W anycase pomocą powinny być BootStrapCacheLoader i BootstrapCacheLoaderFactory.

Ja tylko daje pojęcia, gdzie ładujemy DiskStore do memeory po uruchomieniu aplikacji

można zaimplementować BootstrapCacheLoader który załaduje elementy cache, jak poniżej. Definicja metody: BootstrapCacheLoader.obciążenie (ehcache cache) może być

 //CustomBootstrapCacheLoader implements BootstrapCacheLoader 


     List<?> keys = cache.getKeys(); 

     if ((keys == null) || keys.isEmpty()) 
     { 
      return; 
     } 

     for (Object key : keys) 
     { 
      Element el = cache.getQuiet(key); 
      cache.removeQuiet(key); 
      cache.putQuiet(el); 
     } 

Nad metodą odczytuje element z DiskCache, usuwa go i umieszcza ją z powrotem tak, że pozostaje w pamięci i wersja dysku zostanie usunięty.

Wdrożenie BootstrapCacheLoaderFactory tak że

public class CustomBootstrapCacheLoaderFactory extends BootstrapCacheLoaderFactor 
{ 
. 
. 
@Override 
public BootstrapCacheLoader createBootstrapCacheLoader(Properties properties) 
{ 
    CustomBootstrapCacheLoader loader = new CustomBootstrapCacheLoader(); 
    loader.setAsynchronous(getAsyncFromProperty(properties)); 

    return loader; 
} 
. 
. 
} 

Można zdefiniować konfigurację pamięci podręcznej jak poniżej CustomBootstrapCacheLoaderFactory jak poniżej

<cache 
     name="DummyCacheEl" 
     maxElementsInMemory="3500" 
     eternal="true" 
     overflowToDisk="false" 
     diskPersistent="true" 
     memoryStoreEvictionPolicy="LRU"> 
     <bootstrapCacheLoaderFactory class="CustomBootstrapCacheLoaderFactory" properties="async=true"/> 
</cache> 
+2

+1 dla BootstrapCacheLoader. Mała sugestia w twoim kodzie dotycząca usuwania z dysku i ładowania ich do pamięci, Element el = cache.removeAndReturnElement (key); Polecam to podejście raczej robi się, a następnie usuwa element. –

+0

Prawda, ale powiadamia CacheEventListener. Może nie być wymagane podczas ładowania pamięci podręcznej. – Chandra

+0

Tak, więc na wypadek, gdyby nie było skonfigurowanych powiadomień dla tej pamięci podręcznej, to pomoże to w wydajności. –

0

Nie używałem ehcache wcześniej, ale na podstawie dokumentacji, chciałbym spróbować następujących metod:

Zwraca listę wszystkich elementów w pamięci podręcznej, czy nie są one wygasłe. Zwrócone klucze są unikatowe i można je uznać za zestaw.

Zwrócona lista nie jest aktywna. To jest kopia.

Zajęty czas to O (n).

Niezwykle kosztowne sprawdzić, czy wartość istnieje w pamięci podręcznej.

  • Alternatywnie, można skonstruować (n) query kruszywo, które dotknąć wszystkich obiektów w pamięci podręcznej. Rozumiem, że pamięć podręczna może być dostępna do przeszukiwania.

We wszystkich powyższych metodach chodzi o wykonanie operacji dotykającej wszystkich elementów pamięci podręcznej, w nadziei, że dotyk przyniesie do pamięci elementy przechowywane na dysku.

Powiązane problemy