Может ли ссылка на javax.persistence.EntityManager быть кэширована? - PullRequest
1 голос
/ 03 сентября 2010

Можем ли мы кэшировать ссылку на EntityManager.

Что касается нашего требования, то вместо того, чтобы вставлять EntityManger в другие EJB, у нас есть служебный класс, который будет возвращать ссылку на entitymanager.Проблема в том, что каждый раз, когда нам нужно получить ссылку, мы выполняем поиск JNDI.

Чтобы избежать поиска JNDI, мы хотим кэшировать ссылку на менеджер сущностей в hashmap и т. Д.

Кажется, он работает, но у меня есть несколько сомнений: 1. Если мы кешируем entityManager, будет ли он удерживать соединение, пока ссылка активна?2. Будут ли какие-либо изменения в управлении транзакциями?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 03 сентября 2010

EntityManager не являются потокобезопасными, поэтому, как минимум, вам необходимо кэшировать их локально или в потоке по идентификатору потока.в большинстве случаев, да, открытие EntityManager означает, что вы держите соединение с базой данных.

Вопрос 2) Возможно, но вы не сказали, какую стратегию вы используете в настоящее время для управления транзакциями.

Еще одна большая проблема заключается в том, что если вы используете EM правильно в соответствии со спецификацией, вам нужно утилизировать его и получать новый всякий раз, когда из него выходит исключение.Это означает, что вам нужно правильно управлять этим кешем, где бы из него ни возникало исключение.

Похоже, вы пытаетесь использовать JPA как просто оболочку JDBC.Получение нового EM для каждого отдельного оператора SQL, а затем его удаление.Вы не предоставили никакой информации об архитектуре системы, возможно, такая золотая середина, как шаблон Open EntityManager in View, облегчила бы вашу проблему, не пытаясь изобрести новое колесо?

0 голосов
/ 03 сентября 2010

Что касается нашего требования, вместо внедрения EntityManger в другие EJB, у нас есть служебный класс, который будет возвращать ссылку на entitymanager.

Возможно, есть очень веские причины, но какие именно ограничения, почему вы не можете использовать инъекцию? В любом случае, поиск определяется как проблема? Вы что-нибудь измеряли? Сколько времени представляет поиск по сравнению с общим временем обработки? Это не пренебрежимо мало?

Чтобы избежать поиска в JNDI, мы хотим кэшировать ссылку на менеджер сущностей в hashmap и т. Д. *

Если честно, тот факт, что вы задаете вопросы здесь, является сильным намеком на то, что вы не должны идти по этому пути. Как насчет управления транзакциями? Как насчет обработки исключений (вы должны отказаться от EM после исключения)? Как насчет управления памятью?

Если мы кешируем entityManager, будет ли он удерживать соединение, пока активна ссылка?

Ресурсы (если они были получены) не будут выпущены, так что да. Из документации Hibernate EM:

5,1. Менеджер сущностей и объемы транзакций

A EntityManagerFactory является дорогой в создании, потокобезопасный объект предназначен для общего пользования всеми темы приложений. Создан один раз, обычно при запуске приложения.

An EntityManager является недорогим, не потокобезопасный объект, который должен быть используется один раз, для одного бизнеса процесс, единица работы, и затем отбрасывается. An EntityManager не получит соединение JDBC (или источник данных), если это не нужно , так что вы можете безопасно открыть и закрыть EntityManager даже если вы не уверен, что доступ к данным будет необходим для обслуживания конкретного запроса *. (Это становится важным, как только вы реализуя некоторые из следующих шаблоны, использующие перехват запросов.)

...

и позже:

5.2.1. Неуправляемая среда

...

Вызов close() отмечает конец EntityManager. Основным значением close() является освобождение ресурсов - убедитесь, что вы всегда закрыты и никогда не выходите за пределы гарантированного блока finally .

Магии нет. Если EM должен взаимодействовать с базой данных, он установит соединение. И это соединение не будет разорвано, если вы не close EntityManager. Проверьте исходный код базового Hibernate Session, если хотите.

Будут ли какие-либо изменения в управлении транзакциями?

Ну, вы ничего не сказали о том, что вы в данный момент используете (менеджер сущностей, управляемый контейнером? Менеджер сущностей, управляемый приложением?), И вы не объяснили, как управляются транзакции (менеджер сущностей JTA? Ресурс - локальный менеджер сущностей?). Во всяком случае, ответ ... вероятно.

Может быть, вам следует объяснить, как все работает в настоящее время (перед тем, как начать кэшировать менеджеры сущностей).

И я бы лично измерил вещей, я не уверен, что есть проблема. Если вы не докажете, что есть проблема, то то, что вы пытаетесь сделать, не стоит этих проблем.

...