EHCache, похоже, не работает - PullRequest
0 голосов
/ 24 апреля 2009

Я настроил ehcache в нашем приложении Java, которое использует Spring и Hibernate. Однако, когда я запускаю тесты 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>

Есть идеи, как заполнить кеш? Спасибо.

Ответы [ 4 ]

2 голосов
/ 08 мая 2009

Обычно элементы заполняются в кэш Hibernate автоматически.

В вашей конфигурации я заметил одну вещь: вы не включили статистику. Добавить недвижимость

hibernate.generate_statistics=true

к конфигурации фабрики вашего сеанса и посмотрите, встречаются ли числа в вашем выводе.

1 голос
/ 14 декабря 2010

да, когда вы используете второй кеш в спящем режиме, когда вы будете запрашивать, вы должны установить так:

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

если вы весна, вы должны написать так

getHibernateTemplate().setCacheQueries(true);
0 голосов
/ 02 марта 2010

Попробуйте использовать net.sf.ehcache.hibernate.SingletonEhCacheProvider вместо net.sf.ehcache.hibernate.EhCacheProvider

0 голосов
/ 24 апреля 2009

Прежде всего, вы уверены, что использование кэша для ActionItem s должно быть read-only? Как эти пункты изначально заполняются? И, даже если это подходит для вашей бизнес-модели, рассмотрите возможность изменения ее на nonstrict-read-write, чтобы посмотреть, изменит ли она что-либо в вашем тесте.

Затем попытались выполнить запрос byResourceUniqueName с включенным кэшированием:

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

Несмотря на то, что параметр cacheable должен влиять только на кэширование результирующего набора запроса, опять же, посмотрите, изменит ли он что-либо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...