Кэшированный запрос Hibernate не обновляется при вставке новой записи - PullRequest
4 голосов
/ 21 июля 2011

У нас есть кластер EHCache, hibernate и Mysql.

Все работает почти нормально.Поиск по критериям кэшируется, и при изменении записей на других членах кластеров кэшированные запросы мгновенно обновляются на других серверах.

Однако моя проблема заключается в том, что новые записи вставляются.Кэшированные запросы в этой таблице не будут знать об этом, пока не истечет срок действия кэшированных запросов.

Возможно, я что-то упустил в своей конфигурации EHcache.xml, но я понятия не имею, что это может быть.

Есть идеи?

Ниже следует EHCache.xml:

`

<!--<diskStore path="java.io.tmpdir"/>-->

<!-- means for cache replication -->

<cacheManagerPeerProviderFactory
    class="net.sf.ehcache.distribution.jgroups.JGroupsCacheManagerPeerProviderFactory"
    properties="connect=
        TCP(bind_port=10700):
        S3_PING(...):
        MERGE2(max_interval=30000;min_interval=10000):
        FD_SOCK(start_port=0):
        FD(timeout=3000;max_tries=3):
        VERIFY_SUSPECT(timeout=1500):
        BARRIER():
        pbcast.NAKACK(use_mcast_xmit=false;gc_lag=0;retransmit_timeout=300,600,1200,2400,4800;discard_delivered_msgs=true):
        UNICAST(timeout=300,600,1200):
        pbcast.STABLE(stability_delay=1000;desired_avg_gossip=50000;max_bytes=400K):
        pbcast.GMS(print_local_addr=true;join_timeout=300;view_bundling=true):
        FC(max_credits=2M;min_threshold=0.10):
        FRAG2(frag_size=60K):
        pbcast.STREAMING_STATE_TRANSFER()"
    propertySeparator="::" />    

<!-- default query cache to be used for all queries without an explicit cache -->

<cache
    name="org.hibernate.cache.StandardQueryCache"
    maxElementsInMemory="100"
    eternal="false"
    timeToLiveSeconds="600"
    overflowToDisk="false"
    statistics="true">
    <cacheEventListenerFactory
        class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory"
        properties="replicateAsynchronously=true, replicatePuts=true,
        replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true" />
</cache>    

<!-- timestamps of particular last update time to tables -->

<cache
    name="org.hibernate.cache.UpdateTimestampsCache"
    maxElementsInMemory="5000"
    eternal="true"
    overflowToDisk="false"
    statistics="true">
    <cacheEventListenerFactory
        class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory"
        properties="replicateAsynchronously=true, replicatePuts=true,
        replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true" />
</cache>

<!-- default cache to use for all cacheable entities without an explicit cache -->

<defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="600"
        timeToLiveSeconds="600"
        overflowToDisk="false"
        maxElementsOnDisk="10000000"
        diskPersistent="false"
        diskExpiryThreadIntervalSeconds="600"
        memoryStoreEvictionPolicy="LRU"
        statistics="true">
        <cacheEventListenerFactory
            class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory"
            properties="replicateAsynchronously=true, replicatePuts=true,
            replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true" />
</defaultCache>

`

Ответы [ 2 ]

5 голосов
/ 30 апреля 2014

Боюсь, это уже слишком поздно для автора, но я подумал, что мой ответ может быть полезен для всех, кто сталкивается с той же проблемой.

Вы должны помнить, как StandardQueryCache и UpdateTimestampsCache Работа.Когда кеш запроса проверяется на предмет запроса, время, когда запрос был кэширован, сравнивается с отметками времени последнего обновления всех таблиц в запросе.Если какие-либо таблицы были обновлены после того, как запрос был кэширован, кэшированный результат отбрасывается и вместо него используется база данных.Отметки времени последнего обновления для каждой таблицы хранятся в UpdateTimestampsCache.

. В приведенной выше конфигурации значения из UpdateTimestampsCache не копируются в другие элементы кластера, поэтому Hibernate просматривает старые отметки времении считает, что кэшированный запрос является актуальным.В результате вновь вставленные записи игнорируются.Чтобы исправить это, просто установите replicateUpdatesViaCopy для UpdateTimestampsCache в true.

0 голосов
/ 04 августа 2011

Ссылка: Конфигурация Ehcache

Обратите внимание, что вечный атрибут при значении true переопределяет timeToLive и timeToIdle, поэтому истечение срока действия не может быть выполнено.

У вас есть 1 вечный атрибут, устанавливающий значение true.Может быть, вы можете попробовать установить его в false и посмотреть, поможет ли это?

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