@Stateless
public class CacheSessionBean implements CacheSessionLocal {
private static Map<String, Object> cacheMap = new HashMap<String, Object>();
public Object getCache(String key) {
return cacheMap.get(key);
}
public void putCache(String key, Object o) {
cacheMap.put(key, o);
}
}
Предостережения относительно распределения EJB-компонентов в кластере применяются к статическим переменным. Однако, если вы не кластеризуетесь, они в значительной степени к вам не относятся, поэтому на этом уровне статика - «окей докей».
У вас будут проблемы с синхронизацией.
Один из способов смягчения - настройка контейнера для создания и объединения в пул только одного экземпляра компонента CacheSession, тогда контейнер будет управлять этой синхронизацией за вас.
Вы также можете управлять синхронизацией самостоятельно, но вы не должны делать это на уровне метода EJB, скорее всего, вам лучше иметь синхронизированный объект Cache (по сравнению, скажем, с универсальным HashMap).
Но ключ к этому моменту в том, что статические переменные - это просто статические переменные.
Теоретически, вам необходимо быть осведомленным о жизненном цикле контейнера для вашего сессионного компонента (поскольку он может потенциально освобождать все экземпляры и, следовательно, фактический класс компонента может иметь право на сборщик мусора, что может привести к потере любых статических данных). Однако на практике, если услуга популярна, это вряд ли произойдет. Но, к вашему сведению, это МОЖЕТ БЫТЬ.