簡體   English   中英

EHCache似乎不起作用

[英]EHCache doesn't seem to work

我已經在使用Spring和Hibernate的Java應用程序上設置了ehcache。 但是,當我運行Junit測試並打印統計信息時,似乎緩存中沒有任何內容:

每次緩存的緩存管理器統計數據輸出:

COM。****。SERVICES.CLARITY.DOMAIN.ACTIONITEM.BYRESOURCEUNIQUENAME:getCacheHits:0 getCacheMisses:0 getObjectCount:0

COM。****。SERVICES.CLARITY.DOMAIN.ACTIONITEM:getCacheHits:0 getCacheMisses:0 getObjectCount:0

COM。****。SERVICES.CLARITY.DOMAIN.RESOURCE:getCacheHits:0 getCacheMisses:0 getObjectCount:0

映射文件的內容(僅部分,太大而無法粘貼):

<class name="ActionItem" table="CAL_ACTION_ITEMS" mutable="false" lazy="false" >
<cache region="com.****.services.clarity.domain.ActionItem" usage="read-only" include="all" />

[...]

<query name="byResourceUniqueName" cacheable="true" cache-region="com.****.services.clarity.domain.ActionItem.byResourceUniqueName" read-only="true">
    FROM ActionItem WHERE id IN (
        SELECT DISTINCT actionItemId FROM ActionItemAssignee as aia WHERE assigneeId IN (
            SELECT userId FROM Resource WHERE uniqueName = :uniqueName
        )
    )
    ORDER BY dueDate
</query>

EHCACHE.XML的內容:

<cache
    name="com.****.services.clarity.domain.ActionItem"
    maxElementsInMemory="2000" eternal="false" timeToIdleSeconds="0"
    timeToLiveSeconds="600" overflowToDisk="false" />

<cache
    name="com.****.services.clarity.domain.ActionItem.byResourceUniqueName"
    maxElementsInMemory="2000" eternal="false" timeToIdleSeconds="0"
    timeToLiveSeconds="60" overflowToDisk="false" />

<defaultCache maxElementsInMemory="200" eternal="false"
    timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
    memoryStoreEvictionPolicy="LRU" />

HIBERNATE CONFIG:

    <property name="hibernateProperties">
        <value>
            hibernate.format_sql=true
            hibernate.dialect=org.hibernate.dialect.OracleDialect
            hibernate.cache.provider_class=net.sf.ehcache.hibernate.EhCacheProvider
            hibernate.cache.use_query_cache=true
            hibernate.show_sql=true
        </value>
    </property>
</bean>

關於如何填充緩存的任何想法? 謝謝。

通常,這些項目會由Hibernate自動填充到緩存中。

我在您的配置中注意到的一件事是您沒有啟用統計信息。 添加屬性

hibernate.generate_statistics=true

到會話工廠的配置,然后查看輸出中是否出現數字。

是的,當您在hibernate中使用第二個緩存時,要進行查詢時,必須這樣設置:

Query q=....
q.setCacheable(tre);

如果你是春天,你必須這樣寫

getHibernateTemplate().setCacheQueries(true);

嘗試使用net.sf.ehcache.hibernate.SingletonEhCacheProvider代替net.sf.ehcache.hibernate.EhCacheProvider

首先,您確定ActionItem的緩存使用情況應該是read-only嗎? 這些項目最初是如何填充的? 而且,即使這對您的業務模型是正確的,也可以考慮將其更改為nonstrict-read-write ,以查看它在測試中是否有任何更改。

然后,您是否嘗試在啟用緩存的情況下執行byResourceUniqueName查詢:

Query q = getSession().getNamedQuery("byResourceUniqueName");
q.setCacheable(true);
List result = q.list();

即使cacheable參數僅影響查詢結果集的緩存,請再次查看其是否有任何變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM