我正在使用休眠二级缓存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级,实际上按预期工作?