Что касается нашего требования, вместо внедрения EntityManger в другие EJB, у нас есть служебный класс, который будет возвращать ссылку на entitymanager.
Возможно, есть очень веские причины, но какие именно ограничения, почему вы не можете использовать инъекцию? В любом случае, поиск определяется как проблема? Вы что-нибудь измеряли? Сколько времени представляет поиск по сравнению с общим временем обработки? Это не пренебрежимо мало?
Чтобы избежать поиска в JNDI, мы хотим кэшировать ссылку на менеджер сущностей в hashmap и т. Д. *
Если честно, тот факт, что вы задаете вопросы здесь, является сильным намеком на то, что вы не должны идти по этому пути. Как насчет управления транзакциями? Как насчет обработки исключений (вы должны отказаться от EM после исключения)? Как насчет управления памятью?
Если мы кешируем entityManager, будет ли он удерживать соединение, пока активна ссылка?
Ресурсы (если они были получены) не будут выпущены, так что да. Из документации Hibernate EM:
A EntityManagerFactory
является
дорогой в создании, потокобезопасный объект
предназначен для общего пользования всеми
темы приложений. Создан
один раз, обычно при запуске приложения.
An EntityManager
является недорогим,
не потокобезопасный объект, который должен быть
используется один раз, для одного бизнеса
процесс, единица работы, и
затем отбрасывается. An EntityManager
не получит соединение JDBC (или
источник данных), если это не нужно ,
так что вы можете безопасно открыть и закрыть
EntityManager
даже если вы не
уверен, что доступ к данным будет необходим
для обслуживания конкретного запроса *. (Это
становится важным, как только вы
реализуя некоторые из следующих
шаблоны, использующие перехват запросов.)
...
и позже:
...
Вызов close()
отмечает конец EntityManager
. Основным значением close()
является освобождение ресурсов - убедитесь, что вы всегда закрыты и никогда не выходите за пределы гарантированного блока finally .
Магии нет. Если EM должен взаимодействовать с базой данных, он установит соединение. И это соединение не будет разорвано, если вы не close
EntityManager. Проверьте исходный код базового Hibernate Session
, если хотите.
Будут ли какие-либо изменения в управлении транзакциями?
Ну, вы ничего не сказали о том, что вы в данный момент используете (менеджер сущностей, управляемый контейнером? Менеджер сущностей, управляемый приложением?), И вы не объяснили, как управляются транзакции (менеджер сущностей JTA? Ресурс - локальный менеджер сущностей?). Во всяком случае, ответ ... вероятно.
Может быть, вам следует объяснить, как все работает в настоящее время (перед тем, как начать кэшировать менеджеры сущностей).
И я бы лично измерил вещей, я не уверен, что есть проблема. Если вы не докажете, что есть проблема, то то, что вы пытаетесь сделать, не стоит этих проблем.