2012-01-22 6 views
7

Tôi đang cố định cấu hình Ehcache (phiên bản 2.5) sao cho nó không bao giờ quên các mục. Tôi đang cấu hình lập trình và tôi chưa chạm vào bất kỳ tệp cấu hình XML nào. Bằng cách đặt eternal thành true, tôi hiểu rằng các trường hợp duy nhất mà một mục có thể bị xóa khỏi bộ nhớ cache sẽ là nếu tôi hết dung lượng đĩa hoặc vượt quá maxBytesLocalDisk (hoặc nếu ứng dụng chấm dứt). Tuy nhiên, chương trình thử nghiệm này không hiển thị hành vi:Ehcache đặt vĩnh cửu nhưng vẫn quên các yếu tố?

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

Vì vậy, sau khi thêm 1 triệu yếu tố để bộ nhớ cache của tôi, mà tôi nói với tràn vào một đĩa đủ lớn bởi thứ tự độ lớn, tôi chỉ kết thúc với 3276 mục ở cuối. Chuyện gì đang xảy ra ở đây?

Trả lời

6

Khi sử dụng ARC, hoặc cấu hình bộ nhớ cache dựa trên byte, Ehcache sẽ cố gắng bảo vệ hệ thống của bạn một OOME. Cấu hình bộ nhớ cache như bạn đã làm, nói với ehcache rằng bạn muốn bộ nhớ cache này sử dụng tối đa 1 megabyte heap. Tràn vào đĩa nói với Ehcache để tràn các yếu tố vào đĩa khi đống được lấp đầy đến ngưỡng. Bây giờ, bộ khóa cho bộ nhớ cache này sẽ vẫn còn trên heap. Và, như Ehcache vẫn cố gắng bảo vệ bạn khỏi OOME, nó sẽ cần phải đuổi khỏi đĩa, ngay sau khi tập hợp khóa không thể được giữ trong bộ nhớ nữa.

Tôi hơi thay đổi cấu hình của bạn để sử dụng 10MB, tôi có thể nhận được 32K mục trong Bộ nhớ cache. Nếu tôi thay đổi khóa của bạn để nhỏ hơn (chỉ có thể hiện Integer), tôi có thể nhận được 46K mục trong Cache. Nhưng về cơ bản, cấu hình của bạn sử dụng là hạn chế, vì Ehcache sẽ không bao giờ có thể giữ được nhiều trên đĩa, với bộ khóa trên heap. Hy vọng điều này làm rõ một chút.

Nếu bạn thực sự có một trường hợp sử dụng khi bạn cần phải đặt rất nhiều trên đĩa và giảm thiểu lưu trữ trên heap, bạn có thể muốn xem xét http://ehcache.org/documentation/user-guide/storage-options#enterprise-diskstore

+0

tôi không thực sự có ý định sử dụng chỉ 1MB của đống; Tôi đặt nó theo cách đó chỉ để đảm bảo rằng tôi sẽ đến mức cần phải tràn vào đĩa. Tôi sẽ sử dụng một vài GB đống, nhưng tôi muốn chắc chắn rằng tôi đã có nó cấu hình để hoàn toàn không bao giờ quên các yếu tố. –

+0

Tôi cho rằng điều này trả lời câu hỏi như được hỏi, vì vậy hãy [xem câu hỏi mới của tôi] (http://stackoverflow.com/q/8980467/387852) để biết có cách nào để đảm bảo các phần tử ** không bao giờ ** nhận được không đuổi khỏi ổ đĩa (trong phiên bản miễn phí). –