2012-01-22 15 views
7

Ehcache'yi (sürüm 2.5), öğeleri asla unutmaması için yapılandırmaya çalışıyorum. Programlı olarak yapılandırıyorum ve yapılandırma XML dosyalarından hiçbirine dokunmadım. eternal'u true olarak ayarlayarak, bir öğenin önbellekten kaldırılabildiği tek koşul, disk alanı bittiğinde veya maxBytesLocalDisk'u aşarsa (veya uygulama sonlanırsa) olur.Ehcache sonsuza ayarlandı, ancak yine de öğeleri unuttun mu?

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());  
} 

Yani büyüklüğe göre yeterince büyük bir diske taşmaya anlattı benim önbellek, 1 milyon elemanları ekledikten sonra, sadece ile bitirmek: Ancak, bu test programı bu davranışı göstermez Sonunda 3276 ürün. Burada ne oluyor?

cevap

6

ARC veya bayt tabanlı önbellek yapılandırması kullanıldığında, Ehcache bir OOME sisteminizi korumayı deneyecektir. Önbelleği yaptığınız gibi yapılandırma, ehcache'ye bu önbelleğin en çok 1 megabaytlık yığınta kullanılmasını istediğinizi bildirir. Diske taşma, Ehcache öğesinin, yığın eşiğe doldurulduğunda öğeleri diske taşmasını söyler. Şimdi, bu önbellek için ayarlanan anahtar hala yığınta kalacaktır. Ve Ehcache hala sizi OOME'tan korumaya çalıştığı için, anahtar seti artık bellekte saklanamadığı anda diskten çıkması gerekecek.

10MB kullanmak için yapılandırmanızı biraz değiştirdim, Önbellekte 32K girişleri alabilirim. Anahtarınızı daha küçük olacak şekilde değiştirirseniz (yalnızca Tamsayı örneği), Önbellekteki 46K girişlerini alabilirim. Ama temel olarak, bu konfigürasyonun kullanımı sınırlayıcı olmaktır, çünkü Ehcache disk üzerinde hiçbir zaman bu kadar diskte tutamayacak ve bu da anahtar üzerinde bir takımdır. Umarım bu biraz açıklar. Gerçekten diskte bir sürü koyun ve üzerine yığın depolama aza indirmek için gereken bir kullanım söz konusuysa

, sen aslında yığın sadece 1MB kullanmayı düşünmüyorsanız http://ehcache.org/documentation/user-guide/storage-options#enterprise-diskstore

+0

içine bakmak isteyebilirsiniz; Diske taşmaya ihtiyaç duyduğum noktadan emin olmak için bu yolu ayarladım. Birkaç GB yığın kullanacağım, ama kesinlikle hiç bir zaman öğeleri unutmayacak şekilde yapılandırıldığından emin olmak istedim. –

+0

Sanırım bu soruları sorduğumuz gibi yanıtlıyoruz, bu yüzden lütfen [yeni soruma bakın] (http://stackoverflow.com/q/8980467/387852) öğelerin ** hiçbir zaman almamasını sağlamanın herhangi bir yolu olup olmadığına bakın disketten (ücretsiz sürümde) tahliye edildi. –

İlgili konular