Внедрить конкретный 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 (вам нужно будет использовать другое имя веб-контекста), чтобы уменьшить потребление ресурсов. (Но вы потеряете контроль над процессом на уровне ОС, один арендатор может использовать все ресурсы без возможности убедиться, что другой получит минимальные ресурсы.)

Другие вопросы по тегам