ehcache write-behind behaviour

*爱你&永不变心* 提交于 2019-12-11 09:08:28

问题


I am using an EhCache based cacheWriter for write-behind cache implementation.

here is the config:

<cache name="CACHE_JOURNALS" 
    maxElementsInMemory="1000"
    eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120"
    overflowToDisk="true" maxElementsOnDisk="10000000" diskPersistent="false"
    diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU">
        <cacheWriter writeMode="write-behind"
            maxWriteDelay="2" 
            rateLimitPerSecond="20" 
            writeCoalescing="true"
            writeBatching="false" 
            writeBatchSize="1" 
            retryAttempts="2"
            retryAttemptDelaySeconds="2">
            <cacheWriterFactory
                class="JournalCacheWriterFactory"
                properties="just.some.property=test; another.property=test2"
                propertySeparator=";" />
        </cacheWriter>
    </cache>

after I do a cache.putWithWriter

cache.putWithWriter(new Element(key, newvalue));

another thread tends to read from cache with 'key'

observation:

  • if < 2s then I get the old value
  • if > 2s then I get the updated value (newvalue)

It seems that cache is updated with 'key':newvalue only after write to datastore.

  • Q1.Is this the expected behaviour for write-behind?
  • Q2.Is there any way the get it to update the cache with 'key':newvalue just as soon as the 'putWithWriter' call completes and then have a deferred write behind.

From the documentation, it seems that the later is what is implied.


回答1:


Q1: No. I don't even see how that would actually happen!

Q2: n/a as what you observe isn't the expected behavior, but the new value should be observable in the cache right away.

Could it be you use this cache with some read through of some kind and actually observe the Cache's Entry being evicted/expired and actually repopulate with the old value from the Datastore?




回答2:


This was a naive error on my side, the code calling the @Cacheble method was from the same spring service.

Spring does not intercept calls from-to the same service.

I refactored the cache enabled code out and it works as expected.



来源:https://stackoverflow.com/questions/25157014/ehcache-write-behind-behaviour

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!