0

我已经在使用 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" />

休眠配置:

    <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>

关于如何填充缓存的任何想法?谢谢。

4

4 回答 4

2

通常,这些项目会由 Hibernate 自动填充到缓存中。

我在您的配置中注意到的一件事是您没有启用统计信息。添加属性

hibernate.generate_statistics=true

到你的会话工厂的配置,看看你的输出中是否出现了数字。

于 2009-05-08T09:22:08.330 回答
1

是的,当你在 hibernate 中使用第二个缓存时,当你查询时,你必须像这样设置:

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

如果你春天你必须这样写

getHibernateTemplate().setCacheQueries(true);
于 2010-12-14T06:59:39.057 回答
0

首先,你确定 s 的缓存使用ActionItem应该是 sread-only吗?这些项目最初是如何填充的?而且,即使这对您的业务模型是正确的,也请考虑将其更改为nonstrict-read-write,以查看它是否会更改您的测试中的任何内容。

然后,您是否尝试过byResourceUniqueName在启用缓存的情况下执行查询:

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

即使cacheable参数应该只影响查询结果集的缓存,同样,看看它是否改变了任何东西。

于 2009-04-24T19:11:24.757 回答
0

尝试使用 net.sf.ehcache.hibernate.SingletonEhCacheProvider 而不是 net.sf.ehcache.hibernate.EhCacheProvider

于 2010-03-02T06:25:04.647 回答