ehcache如何进行多线程写入?
How to do multi-threaded writing in ehcache?
下面是我在多线程读写时使用ehcache的代码:
编写代码:
try {
targetCache.acquireWriteLockOnKey(key);
targetCache.putIfAbsent(new Element(key, value));
}
finally {
targetCache.releaseWriteLockOnKey(key);
}
阅读代码:
try{
cache.acquireReadLockOnKey(key);
cacheCarId = (String)ele.getObjectValue();
}
finally {
cache.releaseReadLockOnKey(key);
}
键和值都是字符串。
我的配置如下:
CacheConfiguration config = new CacheConfiguration();
config.name("carCache");
config.maxBytesLocalHeap(128, MemoryUnit.parseUnit("M"));
config.eternal(false);
config.timeToLiveSeconds(60);
config.setTimeToIdleSeconds(60);
SizeOfPolicyConfiguration sizeOfPolicyConfiguration = new SizeOfPolicyConfiguration();
sizeOfPolicyConfiguration.maxDepth(10000);
sizeOfPolicyConfiguration.maxDepthExceededBehavior("abort");
config.addSizeOfPolicy(sizeOfPolicyConfiguration);
Cache memoryOnlyCache = new Cache(config);
CacheManager.getInstance().addCache(memoryOnlyCache);
值在 60 秒内被逐出,将由多线程写入。密钥总数小于25,000。
一开始读写还可以,但是几个小时后,就出现读写不一致的问题了...
有人可以帮我解决这个问题吗?非常感谢
Cache 已经是线程安全的数据结构,因此您不需要像现在这样使用显式锁定。
此外,方法 Cache.putIfAbsent
已经是一个原子操作,可以保证只有一个线程会成功执行 put。
请注意,驱逐和过期是两个不同的事情。使用您的配置,当缓存大小超过 128MB 并且过期确实在 60 秒后发生时,就会发生驱逐。但是 Ehcache 确实会在线过期,因此当您读取或写入映射时会触发它。
至于你对不一致的评论,你需要更详细地描述你的意思。
下面是我在多线程读写时使用ehcache的代码:
编写代码:
try {
targetCache.acquireWriteLockOnKey(key);
targetCache.putIfAbsent(new Element(key, value));
}
finally {
targetCache.releaseWriteLockOnKey(key);
}
阅读代码:
try{
cache.acquireReadLockOnKey(key);
cacheCarId = (String)ele.getObjectValue();
}
finally {
cache.releaseReadLockOnKey(key);
}
键和值都是字符串。
我的配置如下:
CacheConfiguration config = new CacheConfiguration();
config.name("carCache");
config.maxBytesLocalHeap(128, MemoryUnit.parseUnit("M"));
config.eternal(false);
config.timeToLiveSeconds(60);
config.setTimeToIdleSeconds(60);
SizeOfPolicyConfiguration sizeOfPolicyConfiguration = new SizeOfPolicyConfiguration();
sizeOfPolicyConfiguration.maxDepth(10000);
sizeOfPolicyConfiguration.maxDepthExceededBehavior("abort");
config.addSizeOfPolicy(sizeOfPolicyConfiguration);
Cache memoryOnlyCache = new Cache(config);
CacheManager.getInstance().addCache(memoryOnlyCache);
值在 60 秒内被逐出,将由多线程写入。密钥总数小于25,000。
一开始读写还可以,但是几个小时后,就出现读写不一致的问题了...
有人可以帮我解决这个问题吗?非常感谢
Cache 已经是线程安全的数据结构,因此您不需要像现在这样使用显式锁定。
此外,方法 Cache.putIfAbsent
已经是一个原子操作,可以保证只有一个线程会成功执行 put。
请注意,驱逐和过期是两个不同的事情。使用您的配置,当缓存大小超过 128MB 并且过期确实在 60 秒后发生时,就会发生驱逐。但是 Ehcache 确实会在线过期,因此当您读取或写入映射时会触发它。
至于你对不一致的评论,你需要更详细地描述你的意思。