7 votes

Ehcache est réglé sur éternel mais oublie quand même des éléments ?

J'essaie de configurer Ehcache (version 2.5) de telle sorte qu'il n'oublie jamais les éléments. Je configure de manière programmatique et je n'ai touché à aucun des fichiers XML de configuration. En configurant eternal a true je crois comprendre que les seules circonstances dans lesquelles un élément pourrait être retiré de la mémoire cache seraient si je manquais d'espace disque ou si je dépassais maxBytesLocalDisk (ou si l'application se termine). Cependant, ce programme de test ne montre pas ce comportement :

public static void main(String[] args) {
  CacheManager cacheManager = CacheManager.create(); 
  Cache cache = new Cache(
    new CacheConfiguration().name("test")
    .overflowToDisk(true)
    .eternal(true)
    .maxBytesLocalHeap(1, MemoryUnit.MEGABYTES)
    .overflowToOffHeap(false)
    .maxBytesLocalDisk(100, MemoryUnit.GIGABYTES)
    .maxElementsOnDisk(0)
    .timeToIdleSeconds(0)
    .timeToLiveSeconds(0)
    .diskStorePath("E:\\Data\\Ehcache"));
  cacheManager.addCache(cache);
  for(int i = 0; i < 1000000; i++){
    cache.put(new Element("key_" + i, "value_" + i));
  }
  System.out.println(cache.getSize());      
}

Ainsi, après avoir ajouté 1 million d'éléments à mon cache, auquel j'ai demandé de déborder sur un disque suffisamment grand par ordre de grandeur, je ne me retrouve qu'avec 3276 éléments à la fin. Que se passe-t-il ici ?

6voto

Alex Snaps Points 1190

Lorsque vous utilisez ARC, ou une configuration de cache basée sur les octets, Ehcache essaiera de protéger votre système d'un OOME. Configurer le cache comme vous l'avez fait, indique à ehcache que vous voulez que ce cache utilise au maximum 1 mégaoctet de heap. Overflowing to disk indique à Ehcache de faire déborder les éléments sur le disque lorsque le heap est rempli jusqu'au seuil. Maintenant, le jeu de clés pour ce cache restera toujours sur le tas. Et, comme Ehcache essaie toujours de vous protéger de OOME, il devra expulser du disque, dès que le jeu de clés ne pourra plus être maintenu en mémoire.

J'ai légèrement modifié votre configuration pour utiliser 10MB, je peux obtenir 32K entrées dans le cache. Si je modifie votre clé pour qu'elle soit plus petite (seulement l'instance Integer), je peux obtenir 46K entrées dans le cache. Mais en fait, la configuration que vous utilisez est trop restrictive, car Ehcache ne sera jamais capable de contenir autant de données sur le disque, avec la clé définie sur le tas. J'espère que cela clarifie un peu les choses.

Si vous avez vraiment un cas d'utilisation où vous avez besoin de mettre beaucoup de choses sur le disque et de minimiser le stockage sur le tas, vous pouvez vous tourner vers http://ehcache.org/documentation/user-guide/storage-options#enterprise-diskstore

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X