插入新记录时,hibernate缓存查询未更新

时间:2011-07-21 14:17:22

标签: java hibernate spring ehcache

我们有一个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 个答案:

答案 0 :(得分:5)

我担心这对作者来说有点太迟了,但我认为我的答案对于遇到同样问题的其他人都有用。

您应该记住StandardQueryCacheUpdateTimestampsCache的工作原理。检查查询的查询缓存时,将查询缓存的时间与查询中所有表的上次更新的时间戳进行比较。如果在缓存查询后更新了任何表,则会丢弃缓存的结果,而是使用数据库。每个表的上次更新的时间戳存储在UpdateTimestampsCache

在上面的配置中,UpdateTimestampsCache的值不会复制到群集的其他成员,因此Hibernate查看旧的时间戳并认为缓存的查询是最新的。结果,新插入的记录被忽略了。要解决此问题,只需将replicateUpdatesViaCopy的{​​{1}}设置为true即可。

答案 1 :(得分:0)

参考:Ehcache configuration

请注意,永久属性设置为“true”时会覆盖timeToLive和timeToIdle,以便不会发生过期。

您有1个永恒属性设置为true。也许您可以尝试将其设置为false并查看它是否有帮助?