2012-01-06 8 views
5

tôi muốn sử dụng ehcache không chỉ như một bộ nhớ cache mà còn là một thùng chứa các đối tượng bẩn mà tôi muốn tuôn ra cơ sở dữ liệu của mình khi các đối tượng bị đuổi/hết hạn. trong quá trình xử lý thông thường, tôi sử dụng một khóa để tra cứu trong ehcache. nếu không có khóa, tôi đọc dữ liệu từ cơ sở dữ liệu và đặt nó vào ehcache. giá trị thực sự là một đối tượng phức tạp mà tôi sửa đổi. khi điều kiện thời gian/tràn ttl/nhàn rỗi xảy ra, tôi thấy rằng các cuộc gọi lại CacheEventListener được gọi. nhưng có một vấn đề lớn. notifyElementExpired được gọi sau khi khóa-giá trị được xóa khỏi bộ nhớ cache. do đó, có một điều kiện chủng tộc. nếu tôi làm nhiệm vụ xả giá trị bẩn vào cache trong notifyElementExpired và đồng thời, trong một thread khác, đọc cho cùng một khóa xảy ra, thì có một vấn đề đồng bộ hóa. thread thứ hai sẽ không tìm thấy đối tượng trong ehcache, và do đó sẽ đi đến cơ sở dữ liệu trong khi thread khác vẫn đang sẵn sàng để tuôn ra.trường hợp sử dụng này có thể được thực hiện trong ehcache?

tôi đã thử nghiệm bằng ehcache ghi và tôi không nghĩ rằng điều đó cũng hoạt động.

có giải pháp nào ở đây không ??

tôi thực sự sẽ đánh giá cao các giải pháp tốt cho vấn đề này ngay cả khi nó liên quan đến một số cơ chế lưu bộ nhớ cache khác ngoài ehcache.

nhờ

+0

Tôi không thể tìm thấy bất kỳ câu trả lời nào cho câu hỏi này. Vì vậy, tôi đã đi trước và giải quyết nó bản thân mình! Đây là giải pháp mà tôi viết blog về - http://blog.readypulse.com/2012/01/08/ehcache-as-a-true-persistent-store-backed-cache/ –

+1

Công việc tuyệt vời TVinodGupta. Như một lời nhắc thân thiện, bạn có thể tự mình đăng câu trả lời cho câu hỏi và sau đó chấp nhận câu trả lời đó để chúng tôi có thể đóng câu hỏi này không? Ngoài ra, bạn cần chấp nhận câu trả lời cho các câu hỏi trước nếu chúng khắc phục được sự cố của bạn. – Zecas

Trả lời

1

Nếu bạn ok với một bộ nhớ cache hoàn toàn trong bộ nhớ, tôi muốn đề nghị mở rộng Google Guava thư viện của CacheLoader, ví dụ:

public class DBLoader extends CacheLoader<String, String> { 

    @Override 
    public String load(String key) throws Exception { 
     // load a value from the database 
     return value; 
    } 
} 

Sau đó, trong việc sử dụng, một cái gì đó như:

private LoadingCache<String, String> dbCache = CacheBuilder.newBuilder() 
.expireAfterWrite(CACHE_EXPIRE_IN_SECONDS, TimeUnit.SECONDS) 
.build(new DBLoader()); 

String value = dbCache.get(someKey); 


Bạn sẽ cần phải gọn gàng với quy trình xử lý ngoại lệ phù hợp.

Tôi thấy ổi đơn giản hơn nhiều so với việc cấu hình ehcache đúng cách.

+1

Ổi có điều kiện chủng tộc riêng: https://github.com/google/guava/issues/1881 – CurtainDog