我正在使用休眠二級緩存Hazelcast(配置與春天),而第一臺服務器發送驅逐消息到第二臺服務器。第二臺服務器上的驅逐時間戳包括實際驅逐時間+ 1小時。分佈式緩存與休眠第二級驅逐
這會導致第二臺服務器在下一小時內丟失其緩存並對數據庫運行查詢,或者直到本地緩存(來自第二臺服務器)被驅逐。
在注視版本3.6.2實施1小時的間隔是起因由於 getTimeout作用下com.hazelcast.hibernate.HazelcastTimestamper
public static int getTimeout(HazelcastInstance instance, String regionName) {
try {
final MapConfig cfg = instance.getConfig().findMapConfig(regionName);
if (cfg.getTimeToLiveSeconds() > 0) {
// TTL in ms
return cfg.getTimeToLiveSeconds() * SEC_TO_MS;
}
} catch (UnsupportedOperationException e) {
// HazelcastInstance is instance of HazelcastClient.
Logger.getLogger(HazelcastTimestamper.class).finest(e);
}
return CacheEnvironment.getDefaultCacheTimeoutInMillis();
}
的getDefaultCacheTimeoutInMillis返回360
雖然mapConfig .getTimeToLiveSeconds()== 0
AbstractHazelcastRegion獲取超時值
this.timeout = HazelcastTimestamper.getTimeout(instance, regionName);
在org.hibernate.cache.spi.UpdateTimestampsCache
public void preInvalidate(Serializable[] spaces, SessionImplementor session) throws CacheException {
final boolean stats = factory != null && factory.getStatistics().isStatisticsEnabled();
**final Long ts = region.nextTimestamp() + region.getTimeout();**
for (Serializable space : spaces) {
if (DEBUG_ENABLED) {
LOG.debugf("Pre-invalidating space [%s], timestamp: %s", space, ts);
}
try {
session.getEventListenerManager().cachePutStart();
//put() has nowait semantics, is this really appropriate?
//note that it needs to be async replication, never local or sync
region.put(space, ts);
}
finally {
session.getEventListenerManager().cachePutEnd();
}
if (stats) {
factory.getStatisticsImplementor().updateTimestampsCachePut();
}
}
}
在驅逐消息驅逐超時= 360 * 1000實際上被添加到與有問題的緩存時間戳
所得驅逐消息時戳我錯過了什麼或者實際的邏輯是非常有問題的? 沒有人真的有分佈式服務器的工作配置使用hibernate第2級,實際上按預期工作?