【发布时间】:2026-01-04 13:35:01
【问题描述】:
我已经实现了一种缓存 bean 来将数据对象缓存为 EJB 单例。我想知道这是否是 EJB 中的正确方法:
@Singleton
public class MyCache {
int DEFAULT_CACHE_SIZE = 30;
int DEFAULT_EXPIRES_TIME = 60000;
long expiresTime = 0;
long lastReset = 0;
Cache cache = null;
....
@PostConstruct
void init() {
resetCache();
}
public void resetCache() {
cache = new Cache(DEFAULT_CACHE_SIZE);
lastReset = System.currentTimeMillis();
}
public void put(String key, Object value) {
cache.put(key, value);
}
public Object get(String key) {
// test if cache is expired
if (expiresTime > 0) {
Long now = System.currentTimeMillis();
if ((now - lastReset) > expiresTime) {
logger.finest("...... Cache expired!");
resetCache();
}
}
return cache.get(key);
}
class Cache extends LinkedHashMap<String, Object> implements Serializable {
private static final long serialVersionUID = 1L;
private final int capacity;
public Cache(int capacity) {
super(capacity + 1, 1.1f, true);
this.capacity = capacity;
}
protected boolean removeEldestEntry(Entry<String, Object> eldest) {
return size() > capacity;
}
}
}
我的问题是:这是实现应用程序范围缓存机制的正确方法吗?
我的印象是缓存的内容出乎意料地发生了变化。这会发生吗?例如,如果 EJB 被钝化了? 我在 Payara41 服务器中运行。
或者我必须使用:
cache = Collections.synchronizedMap(new Cache(DEFAULT_CACHE_SIZE));
代替:
cache = new Cache(DEFAULT_CACHE_SIZE);
【问题讨论】:
标签: singleton ejb linkedhashmap