Я прочитал ограничения для EJB и несколько ответов здесь по stackoverflow, но я не совсем уверен насчет фрагмента кода, который я нашел на работе.
Есть сервис, который предоставляет подробную информациюо Foos в зависимости от их идентификатора.
public FooResponse getFoo(FooRequest request){...};
Где-то под поверхностью находится самописный пул, который содержит недавно предоставленные объекты ответа.Для каждого запроса пул спрашивается, есть ли доступная запись.Если да, то он используется в качестве ответа, а если нет, то запрашивается база данных.Когда ответ извлекается из базы данных, он сохраняется в пуле.
Пул использует две стратегии, чтобы позаботиться о его размере.Во-первых, он использует java.lang.ref.SoftReference<T>
внутри Map
, чтобы избежать OutOfMemoryError
с.Второе, что он использует, - это java.util.TimerTask
, который создается для каждой записи в Map
и назначается java.util.Timer
, который удаляет запись через настраиваемый промежуток времени.
Это вмое мнение, нарушающее ограничение, заключается в том, что EJB не разрешено создавать потоки (что делает java.util.Timer
).Я прав или я что-то упустил?До сегодняшнего дня это не вызывало каких-либо явных проблем.Вы рекомендуете избавиться от этого самокодированного пула?
Другое дело, что сервис - это SessionBean без состояния.Контейнер создаст не только один из них.Поэтому они не используют один и тот же пул, и было бы удачей, если бы одному бину было предложено примерно Foo
дважды.Я тоже с этим прав?