2012-09-01 14 views
6

मैं अपने अनुप्रयोग में लोड होने वाली वस्तुओं को कैश करने के लिए एशैच का उपयोग कर रहा हूं। स्टार्ट-अप पर मैं सभी आवश्यक वस्तुओं को कैश करता हूं और दिन में एक बार एक अलग प्रक्रिया से ताज़ा हो जाता है।Ehcache ऑब्जेक्ट्स खोना

हालांकि, ऐसा लगता है कि कैश में ऑब्जेक्ट जोड़ने के कुछ ही समय बाद, वे गायब हो जाते हैं। बेदखल होने के बारे में कुछ भी नहीं बताया जा रहा है, लेकिन कुछ कारणों से वस्तुओं को कैश में नहीं चल रहा है।

2012-09-01 17:25:37,121 [main] DEBUG ObjectLoader.getObject():65 - ************************************ 
2012-09-01 17:25:37,121 [main] DEBUG ObjectLoader.getObject():66 - Number of objects in cache: 0 
2012-09-01 17:25:37,121 [main] DEBUG ObjectLoader.getObject():72 - Object not in cache | 501 
2012-09-01 17:26:17,271 [main] DEBUG ObjectLoader.getObject():80 - Number of objects in cache: 1 
2012-09-01 17:26:17,271 [main] DEBUG ObjectLoader.getObject():81 - Number of objects evicted from cache: 0 
2012-09-01 17:26:17,274 [main] DEBUG ObjectLoader.getObject():83 - Object key found: 501 
2012-09-01 17:26:17,274 [main] DEBUG ObjectLoader.getObject():65 - ************************************ 
2012-09-01 17:26:17,274 [main] DEBUG ObjectLoader.getObject():66 - Number of objects in cache: 1 
2012-09-01 17:26:17,274 [main] DEBUG ObjectLoader.getObject():72 - Object not in cache | 518 
2012-09-01 17:26:35,894 [main] DEBUG ObjectLoader.getObject():80 - Number of objects in cache: 1 
2012-09-01 17:26:35,895 [main] DEBUG ObjectLoader.getObject():81 - Number of objects evicted from cache: 0 
2012-09-01 17:26:35,895 [main] DEBUG ObjectLoader.getObject():83 - Object key found: 518 
2012-09-01 17:26:35,895 [main] DEBUG ObjectLoader.getObject():65 - ************************************ 
2012-09-01 17:26:35,895 [main] DEBUG ObjectLoader.getObject():66 - Number of objects in cache: 1 
2012-09-01 17:26:35,895 [main] DEBUG ObjectLoader.getObject():72 - Object not in cache | 516 
2012-09-01 17:27:31,997 [main] DEBUG ObjectLoader.getObject():80 - Number of objects in cache: 1 
2012-09-01 17:27:31,998 [main] DEBUG ObjectLoader.getObject():81 - Number of objects evicted from cache: 0 
2012-09-01 17:27:31,998 [main] DEBUG ObjectLoader.getObject():83 - Object key found: 516 
2012-09-01 17:27:31,998 [main] DEBUG ObjectLoader.getObject():65 - ************************************ 
2012-09-01 17:27:31,998 [main] DEBUG ObjectLoader.getObject():66 - Number of objects in cache: 1 
2012-09-01 17:27:31,998 [main] DEBUG ObjectLoader.getObject():72 - Object not in cache | 515 
2012-09-01 17:28:20,343 [main] DEBUG ObjectLoader.getObject():80 - Number of objects in cache: 1 
2012-09-01 17:28:20,343 [main] DEBUG ObjectLoader.getObject():81 - Number of objects evicted from cache: 0 
2012-09-01 17:28:20,344 [main] DEBUG ObjectLoader.getObject():83 - Object key found: 515 
2012-09-01 17:28:20,344 [main] DEBUG ObjectLoader.getObject():65 - ************************************ 
2012-09-01 17:28:20,344 [main] DEBUG ObjectLoader.getObject():66 - Number of objects in cache: 1 
2012-09-01 17:28:20,344 [main] DEBUG ObjectLoader.getObject():72 - Object not in cache | 525 
2012-09-01 17:29:05,616 [main] DEBUG ObjectLoader.getObject():80 - Number of objects in cache: 1 
2012-09-01 17:29:05,617 [main] DEBUG ObjectLoader.getObject():81 - Number of objects evicted from cache: 0 
2012-09-01 17:29:05,617 [main] DEBUG ObjectLoader.getObject():83 - Object key found: 525 
2012-09-01 17:29:05,617 [main] DEBUG ObjectLoader.getObject():65 - ************************************ 
2012-09-01 17:29:05,617 [main] DEBUG ObjectLoader.getObject():66 - Number of objects in cache: 1 
2012-09-01 17:29:05,618 [main] DEBUG ObjectLoader.getObject():72 - Object not in cache | 512 
2012-09-01 17:29:38,790 [main] DEBUG ObjectLoader.getObject():80 - Number of objects in cache: 1 
2012-09-01 17:29:38,790 [main] DEBUG ObjectLoader.getObject():81 - Number of objects evicted from cache: 0 
2012-09-01 17:29:38,790 [main] DEBUG ObjectLoader.getObject():83 - Object key found: 512 

मैं गलत कॉन्फ़िगर किया गया ehcache है करो या मैं अपने कोड में एक बग की क्या ज़रूरत है: जब मैं ObjectLoader.loadCache चलाने() इस उत्पादन मैं प्राप्त कर रहा हूँ है? किसी भी सहायता की सराहना की जाएगी। धन्यवाद।

मैं वसंत 3.1.0, ehcache वसंत-एनोटेशन 1.1.2, और ehcache 2.4.2

ObjectCacheFacade.java

@Component() 
public class ObjectCacheFacade { 
    private static final String CACHE_KEY = "myObjectCache"; 

    @Resource 
    private CacheManager cacheManager; 
    private Cache cache; 

    public ObjectCacheFacade() { 
     cacheManager = CacheManager.getInstance(); 
     this.cache = cacheManager.getCache(CACHE_KEY); 
    } 

    public Object getObjectFromCache(String objectId) { 
     Object result = null; 
     Element element = cache.get(objectId); 

     if (element != null && element.getValue() != null) { 
      result = element.getObjectValue(); 
     } 

     return result; 
    } 

    public void putObjectIntoCache(String objectId, Object object) { 
     Element element = new Element(objectId, object); 
     cache.put(element); 
    } 

    public int getSize() { 
     return cache.getSize(); 
    } 

    public void removeObjectFromCache(String objectId) { 
     cache.remove(objectId); 
    } 

    public void flushCache() { 
     cache.removeAll(); 
    } 

    public Cache getCache() { 
     return cache; 
    } 
} 

ObjectLoader.java

उपयोग कर रहा हूँ
@Service 
public class ObjectLoader { 
    private static final Logger log = Logger.getLogger(ObjectLoader.class); 

    @Resource 
    protected ObjectDao objectDao; 
    @Resource 
    protected ObjectCacheFacade objectCache; 

    public void loadCache() { 
     List<String> objectIds = objectDao.getObjectIds(); 

     for (String objectId : objectIds) { 
      loadObject(objectId); 
     } 
    } 

    public Object getObject(String objectId) { 
     log.debug("************************************"); 
     log.debug("Number of objects in cache: " + objectCache.getSize()); 

     Object object = objectCache.getObjectFromCache(objectId); 

     if (object == null) { 
      log.debug("Object not in cache | " + objectId); 
      object = objectDao.getObject(objectId); 

      if (object != null) { 
       objectCache.putObjectIntoCache(objectId, object); 

       log.debug("Number of objects in cache: " + objectCache.getSize()); 
       log.debug("Number of objects evicted from cache: " + objectCache.getCache().getCacheEventNotificationService().getElementsEvictedCounter()); 
       for (Object key : objectCache.getCache().getKeys()) { 
        log.debug("Object key found: " + key); 
       } 
      } 
     } 

     return object; 
    } 
} 

ehcache.xml

<ehcache> 
    <diskStore path="java.io.tmpdir"/> 

    <defaultCache 
     maxElementsInMemory="1000" 
     eternal="false" 
     timeToIdleSeconds="60" 
     timeToLiveSeconds="300" 
     overflowToDisk="false" 
     memoryStoreEvictionPolicy="LRU" 
     /> 

    <cache 
     name="myObjectCache" 
     maxElementsInMemory="1000" 
     eternal="true" 
     timeToIdleSeconds="0" 
     timeToLiveSeconds="0" 
     overflowToDisk="false" 
     diskPersistent="true" 
     memoryStoreEvictionPolicy="LRU" 
     /> 

</ehcache> 

applicationContext.xml

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" /> 
+0

मुझे संदेह है कि आप ओवरफ्लो टोडडिस्क = "सत्य" चाहते हैं। इसके अलावा, यदि आप EHCache 2.6 या बाद में उपयोग कर रहे हैं, तो आपको इसके बजाय का उपयोग करना चाहिए। http://ehcache.org/documentation/configuration/fast-restart पर एक नज़र डालें – GreyBeardedGeek

उत्तर

5

diskPersistent के बाद से सच Ehcache के बाद वे कैश में जोड़ा गया था डिस्क के लिए वस्तुओं लिखने के लिए प्रयास किया गया था करने के लिए स्थापित किया गया था। हालांकि, मुख्य कैश्ड ऑब्जेक्ट के अंदर नेस्टेड ऑब्जेक्ट्स में से एक Serializable लागू नहीं किया गया था, इसलिए यह डिस्क लिखने पर अपवाद फेंक रहा था और फिर ऑब्जेक्ट को कैश से बेदखल कर रहा था। यह निष्कासन कैश आंकड़ों में दिखाई नहीं दे रहा था क्योंकि इसे memoryStoreEvictionPolicy द्वारा बेदखल नहीं किया गया था।

यह खोजने के लिए एक बहुत ही आसान बग होना चाहिए था, लेकिन परियोजना में slf4j-log4j12 लाइब्रेरी शामिल नहीं थी, इसलिए लॉग को लिखे जाने के बजाय अपवाद निगल लिया गया था। एक बार लॉगिंग ठीक से संभाला गया था, यह तुरंत स्पष्ट था कि समस्या क्या थी।

ओह ठीक है, लाइव और मुझे लगता है कि सीखें ...

संबंधित मुद्दे