Я реализовал своего рода компонент кэширования для кэширования объектов данных как EJB Singleton.Интересно, это правильный путь в 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);