Внедрить конкретный EntityManager в SessionBean без состояния при условии
В настоящее время я имею дело с веб-приложениями, которые вызывают Session Beans без сохранения состояния для взаимодействия с базой данных. Мой вопрос о том, как такое приложение может вызывать один и тот же сессионный компонент таким образом, чтобы последний мог выбирать, какой менеджер сущностей должен использовать для доступа к базе данных.
В настоящее время я справился с этой ситуацией, запустив разные экземпляры Jboss, прослушивая разные порты, и в каждом случае я развернул один и тот же пул Session Bean, и одно или несколько веб-приложений должны работать с одной и той же базой данных. Другими словами, каждый экземпляр Jboss содержит определенное количество веб-приложений, единицу сохранения (persistence.xml in META-INF jar containing the @Entity's)
и бассейн сессионного компонента внутри уха. Самоочевидно, в чем заключается основной недостаток: чем больше разных баз данных мне нужно иметь в виду, тем больше нужно поддерживать экземпляра Jboss, и он не является устойчивым главным образом, но не только по причине ресурсов.
Мой последний вопрос: какова лучшая практика для развертывания различных веб-приложений, вызывающих сессионные компоненты, которые отличаются только для внедренного в них EntityManager?
заранее спасибо
Stfn
2 ответа
Сделай это с CDI @Producer
метод. Я предполагаю, что вы знаете, как различать множество @PersistenceContext
Если у вас есть продюсер, что-то вроде этого:
// first inject all the entity managers that you have into your CDI producer
@PersistenceContext(name = "name0")
private EntitManager em0;
@PersistenceContext(name = "name1")
private EntitManager em1;
@PersistenceContext(name = "name2")
private EntitManager em2;
...
// then have your producer method with logic to chose the right EntityManager to be returned
@Produces @MyPersistenceContext
public EntityManager obtainTheRightEM(InjectionPoint caller) {
if (hasCondition0(caller)) {
return em0;
} else if (hasCondition1(caller)) {
return em1;
} else if (hasCondition2(caller)) {
return em2;
} else {
...
}
}
Тогда в вашем @EJB
Вы заменяете @PersistenceContext
с @Inject @MyPersistenceContext
,
Кроме того, создавая @MyPersistenceContext
квалификатор может или не может быть необходимым в зависимости от вашей конкретной проблемы. Если у вас есть конкретные значения конфигурации, вам нужно передать их производителю, чтобы облегчить принятие решения о том, какой EntityManager
чтобы вернуться от вашего производителя, посмотрите на использование некоторых @Nonbinding
поля в вашем пользовательском классификаторе.
Вы можете сойти с рук, имея только один @EJB
развертывание.
Ура! Надеюсь это поможет.
Чего вы хотите добиться, не очень понятно...
Используются ли разные БД для разделения данных от разных клиентов (каждая БД имеет одинаковую структуру)? Для этого в Hibernate есть поддержка нескольких арендаторов (http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html/ch16.html), но еще не стандартизированная в JPA.
В любом случае вы можете поместить разные уши в один и тот же экземпляр Jboss (вам нужно будет использовать другое имя веб-контекста), чтобы уменьшить потребление ресурсов. (Но вы потеряете контроль над процессом на уровне ОС, один арендатор может использовать все ресурсы без возможности убедиться, что другой получит минимальные ресурсы.)