Динамическая загрузка DataSource с помощью Jboss внутри EJB-проекта - PullRequest
0 голосов
/ 20 августа 2011

давайте рассмотрим, у меня есть одна основная база данных с одной таблицей.

Я создал XML-файл источника данных в каталоге deploy из jboss и поместил в проект ejb в persistance.xml этот источник данных.

Внутри моего проекта ejb я использую @PersistenceContext и загружаю эту таблицу с этим менеджером сущностей. Внутри таблицы находятся некоторые имена источников данных (имена источников данных являются именами источников данных jndi?), Которые я также создал ранее в каталоге deploy. Этот компонент, который загрузил другие имена источников данных, теперь вызывает другие ejbs и передает им одно из имен источников данных из таблицы.

Этот другой ejb теперь должен подключаться к этой базе данных с заданным именем источника данных вместо внутреннего файла persistance.xml.

Другими словами: я хочу загрузить в один ejb имена источника данных. Затем я хочу вызвать другие ejbs, и каждый ejb должен подключаться к отдельному источнику данных.

Большое спасибо, Hauke ​​

1 Ответ

2 голосов
/ 20 августа 2011

Я не совсем уверен, что вы здесь, так что предостережение звучит так, будто вы пытаетесь сделать что-то немного безумное (JPA не любит динамику во время выполнения).

Однако есть несколько вариантов: я слышу, что вы хотите изменить соединение с базой данных.Во-первых, ваш постоянный XML является только отправной точкой, вам не нужно включать источник данных.Это не лучшая практика, поскольку идея DataSource и datasourse-ds.xml состоит в том, чтобы убедиться, что вы можете настроить приложение без перекомпиляции кода (и нескольких развертываний и т. Д.).Если вы возьмете на себя управление соединением, вы можете использовать своего менеджера сущностей.

Я просто хочу пояснить, что это, вероятно, плохая идея (вы говорите об инфраструктуре ORM - в данном случае - JPA Hibernate)) но вместо использования @PersistenceContext вы можете предоставить свой собственный менеджер сущностей.Я настоятельно рекомендую использовать EclipseLink в качестве обходного пути для этого.Он не так встроен в JBoss, и вы сможете (после его запуска) настроить его с нуля.

http: //wiki.eclipse.org/EclipseLink

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

Длинное и короткое здесь: я думаюВы идете по очень плохому пути и, возможно, хотите переосмыслить дизайн.JPA может быть неправильным инструментом, и, как бы мне не хотелось это говорить, вам, вероятно, лучше с javax.sql , чем с источником данных JPA, если вы постоянно меняете соединения.

В любом случае, используя Eclipselink2.X, вы можете сделать что-то вроде следующего ->

HashMap<String, Object> connectionA new = HashMap<String, Object>();
propsA.put("javax.persistence.jdbc.driver", "driverClass");
propsA.put("javax.persistence.jdbc.url", "connectionString");
. . .
etc...
EntityManager entityManager = Persistence.createEntityManagerFactory("myUnit").
createEntityManager(propsA);

В этот момент вы можете создать новый набор свойств (с новым подключением, поддерживающим его) длякаждый необходимый менеджер.

Кошмар?Да.Контейнер Управляется?Нет - вы будете отвечать за обработку транзакций, но должно ли это работать?Абсолютно.

...