Инъекция EntityManager Vs. EntityManagerFactory
длинный вопрос, пожалуйста, потерпите меня.
мы используем Spring+JPA для веб-приложения. Моя команда обсуждает инъекции EntityManagerFactory на GenericDAO (Дао на основе дженериков что-то на линиях, предоставляемых APPFUSE, мы не используем JpaDaosupport по какой-то причине) над инъекцией EntityManager. Мы используем "управляемое приложением постоянство".
аргументы против инъекции a EntityManagerFactory является ли это слишком тяжелым и поэтому не требуется,EntityManager делает то, что нужно. Кроме того, поскольку Spring создаст новый экземпляр DAO для каждого веб-запроса (я сомневаюсь в этом), не будет никаких проблем с параллелизмом, как в том же EntityManager экземпляр совместно используется двумя потоками.
аргумент для впрыскивать EFM что своя хорошая практика над всем своим всегда хорошим для того чтобы иметь ручку к фабрике.
Я не уверен, что это лучший подход, может кто-то пожалуйста, просветите меня?
4 ответов:
плюсы и минусы введения EntityManagerFactory vs EntityManager все прописаны в весенних документах здесь, Я не уверен, что могу улучшить это.
сказав, что есть некоторые моменты в вашем вопросе, которые должны быть устранены.
...Весна создаст новый экземпляр DAO для каждого веб-запроса...
Это неверно. Если ваш DAO является Spring bean, то это синглтон, если вы не настроите иначе через
scopeатрибут в определении Боба. Создание экземпляра DAO для каждого запроса было бы сумасшедшим.аргумент для инъекции ЭДС заключается в том, что хорошая практика во всем ее всегда хорошо иметь дескриптор фабрика.
этот аргумент не выдерживает критики. Общая хорошая практика говорит, что объект должен быть введен с минимальными сотрудниками, которые он должен делать свою работу.
Я записываю то, что я наконец собрал. Из раздела" реализация DAOs на основе простого JPA" в весенней ссылка:
хотя экземпляры EntityManagerFactory являются потокобезопасными, EntityManager примеров нет. Введенный JPA EntityManager ведет себя как EntityManager извлекается из среды JNDI сервера приложений, как определено спецификацией JPA. Он делегирует все вызовы текущая транзакция EntityManager, если таковой имеется; в противном случае он возвращается для вновь созданного EntityManager за операцию, фактически делая его использование потокобезопасно.
Это означает, что в соответствии со спецификациями JPA экземпляры EntityManager не являются потокобезопасными, но если Spring обрабатывает их, они становятся потокобезопасными.
Если вы используете Spring, лучше ввести EntityManagers вместо EntityManagerFactory.
Я думаю, что это уже было хорошо освещено, но только для усиления нескольких моментов.
Дао, если вводится весной, - это синглтон по умолчанию. Ты должен ... явно установите область для прототипа чтобы каждый раз создавать новый экземпляр.
кормушка сущности впрыснутая мимо @PersistenceContext является потокобезопасным.
это, как говорится, у меня были некоторые проблемы с одноэлементным DAO в моем многопоточном приложении.
я закончил тем, что сделал DAO экземпляром Боба, и это решило проблему.поэтому, хотя в документации может быть сказано одно, вы, вероятно, хотите тщательно протестировать свое приложение.контроль:
Я думаю, что часть моей проблемы заключается в том, что я использую
@PersistenceContext(unitName = "unit", type = PersistenceContextType.EXTENDED)Если вы используете PersistenceContextType.Расширенный, имейте в виду, что вы должны, если я правильно понимаю, вручную закрыть транзакцию. Видеть этой нити для получения дополнительной информации.
еще одно продолжение:
использование экземпляра DAO-крайне плохая идея. Каждый экземпляр DAO будет иметь свой собственный кэш сохраняемости, и изменения в одном кэше не будут распознаны другими компонентами DAO. Извините за плохой совет.
Я обнаружил, что установка аннотации @Repository Spring на наших DAOs и наличие EntityManager, управляемого Spring и вводимого аннотацией @PersistenceContext, является наиболее удобным способом заставить все работать свободно. Вы получаете выгоду от потокобезопасности общего EntityManager и преобразования исключений. По умолчанию общий EntityManager будет управлять транзакциями, если вы объедините несколько DAO из менеджера, например. В конце концов вы обнаружите, что ваш DAOs станет анемичный.
Comments