2014-09-17 3 views
1

У меня есть несколько баз данных с той же структурой, что и на разных серверах (одна база данных для каждого из моих клиентов), моему приложению необходимо подключиться к все они динамически с использованием JTA. Поэтому, когда клиент X выполняет некоторую операцию с базой данных, приложение должно решить во время выполнения, в какой базе данных он подключается, и эта операция будет выполняться только на этой конкретной базе данных. И есть еще одна проблема, мне придется создать один пул соединений для каждый из моих клиентов, если один из них не сможет подключиться, стеклянная рыба даже не начнет.Один динамический EntityManager, подключающийся к нескольким базам данных, являющийся транзакционным типом = «JTA»

Я посмотрел и всюду, и я не нашел хорошего решения. Может ли кто-нибудь мне помочь? Я использую EJB 3 и JPA2 с EclipseLink.

Он может работать, если я изменяю значение unitName в аннотации PersistenceContext во время выполнения, знает ли кто-нибудь, возможно ли это сделать?

+0

Вам нужно еще раз оттолкнуть то, что вы хотите от своего приложения. Аналогичная структура базы данных, означает ли это, что вы будете использовать ту же модель сущности Java? Когда вы пытаетесь найти сущность, в какую базу (ы) будет входить JPA? Как вы ожидаете, какие базы данных будут записаны? Самое простое решение - создать несколько единиц персистентности, каждый из которых имеет свой собственный источник данных в своей собственной базе данных. Затем вы связываете источники данных xa с JTA на вашем сервере. – Chris

+0

Вопрос переписан. @Chris – lucianovcnt

+0

Я не уверен, почему Glassfish не начнется, если ваш источник данных не сможет подключиться. Существует много способов создания источника данных в стеклянной платке, и я предполагаю, что Glassfish можно запустить независимо от его источников данных. Вы имеете в виду приложение, не работающее, когда источник данных недоступен при использовании контейнера с сохранением контейнера? – Chris

ответ

0

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

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

Если вы используете Java EE 6+, вы можете использовать CDI для ввода пользовательского EntityManager; просто сделайте его EJB (аннотируя его с помощью @Stateless), а затем введите его, где хотите аннотировать поле с помощью @Inject:

+0

Вопрос переписан. – lucianovcnt

+1

@lucianovcnt переписать/переписать/переписать –

0

Что вы просите - это приложение с несколькими приложениями, в котором каждый арендатор имеет свою собственную базу данных. Я считаю, что вам лучше сконструировать его так, чтобы каждый арендатор имел свой собственный persistenceUnit, как описано здесь. http://wiki.eclipse.org/EclipseLink/Examples/JPA/Multitenant

Инъекция, хотя и недоступна, если вы идете по этому маршруту, потому что вам нужно будет управлять свойствами, используемыми для создания PersistenceUnits для каждого арендатора. Это позволяет вам использовать один файл persistence.xml - вы должны либо передать в источник данных, чтобы использовать для этого арендатора через http://www.eclipse.org/eclipselink/api/2.5/org/eclipse/persistence/config/EntityManagerProperties.html#JTA_DATASOURCE, либо использовать его, чтобы понять его на основе арендатора. Ресурсы для арендатора должны существовать только при первом использовании EntityManager/EntityManagerFactory, а не при запуске, поэтому вы можете динамически добавлять арендаторов до тех пор, пока вы можете настроить и добавить для них источники данных.

 Смежные вопросы

  • Нет связанных вопросов^_^