2012-09-13 50 views
5

任何人都可以確認是否TTL設置例如timeToLiveSeconds可以使用帶ehcache擴展名的grails緩存插件來設置?Grails緩存-ehcache插件和TTL值

基本插件的文檔明確指出TTL不受支持,但ehcache擴展提到了這些值。到目前爲止,我沒有成功我的緩存設置的TTL值:

grails.cache.config = { 
    cache { 
     name 'messages' 
     maxElementsInMemory 1000 
     eternal false 
     timeToLiveSeconds 120 
     overflowToDisk false 
     memoryStoreEvictionPolicy 'LRU' 
    } 
} 

@Cacheable('messages') 
def getMessages() 

但是消息無限期緩存。我可以使用@CacheEvict註釋手動刷新緩存,但我希望在使用ehcache擴展時支持TTL。

謝謝

+0

這個問題被問了很久以前,但看到的是https:/ /jira.grails.org/browse/GPCACHEEHCACHE-6 –

+0

@Ken現在鏈接已損壞 – GreenGiant

回答

6

是的,cache-ehcache插件絕對支持TTL和EhCache原生支持的所有緩存配置屬性。如文檔中所述,基本緩存插件實現了一個不支持TTL的簡單內存緩存,但緩存DSL將通過任何未知配置設置傳遞給基礎緩存提供程序。

您可以通過添加以下內容Config.groovyCacheConfig.groovy配置了Ehcache設置:

grails.cache.config = { 
    cache { 
     name 'mycache' 
    } 

    //this is not a cache, it's a set of default configs to apply to other caches 
    defaults { 
     eternal false 
     overflowToDisk true 
     maxElementsInMemory 10000 
     maxElementsOnDisk 10000000 
     timeToLiveSeconds 300 
     timeToIdleSeconds 0 
    } 
} 

您可以在運行時驗證緩存設置如下:

grailsCacheManager.cacheNames.each { 
    def config = grailsCacheManager.getCache(it).nativeCache.cacheConfiguration 
    println "timeToLiveSeconds: ${config.timeToLiveSeconds}" 
    println "timeToIdleSeconds: ${config.timeToIdleSeconds}" 
} 

爲其他見EhCache javadoc for CacheConfiguration緩存屬性。您還可以通過登錄grails.plugin.cachenet.sf.ehcache來啓用緩存的詳細調試日誌記錄。

請注意,Grails緩存插件實現了與本機EhCache緩存管理器不同且獨立的緩存管理器。如果您已經直接配置EhCache(使用ehcache.xml或其他方式),那麼這些緩存將與Grails插件管理的緩存分開運行。

注意:Cache-EhCache插件的舊版本確實存在一個錯誤,其中TTL設置未正確設置且對象在一年內過期;這是固定在Grails-Cache-Ehcache 1.1

0

ehcache核心插件支持TTL屬性。你如何安裝插件?對於我的項目,我只有:

compile ":cache-ehcache:1.0.0" 

在BuildConfig.groovy中的插件關閉。由於該插件對核心Grails緩存插件有依賴性,因此不需要聲明它。

0

我可以在啓動時用grails-app/conf/BootStrap.groovy腳本解決此問題,覆蓋配置。

例如,這是重寫默認生存時間來60秒的名爲緩存的「mycache」腳本:

class BootStrap { 

    def grailsCacheManager 

    def init = { servletContext -> 
     grailsCacheManager.getCache("mycache").nativeCache 
         .cacheConfiguration.timeToLiveSeconds = 60 
    } 
    def destroy = { 
    } 
}