Динамический выбор источника данных для среды выполнения сущностей

У меня есть объектный компонент, который будет представлять ожидаемый результат для нескольких баз данных/источников данных, а также может выполнять разные запросы, но всегда возвращается один и тот же результат. Таким образом, bean-компонент повторно используется в разных источниках данных, которые должны иметь возможность динамически выбираться.

Можно ли с помощью JPA выбирать во время выполнения источник данных, который будет использоваться для выполнения запроса, и возвращать тот же тип компонента управления данными? Кроме того, нужно ли моему ejb/приложению определять источники данных, которые будут использоваться? Или я всегда могу указать через jndi, какой источник данных использовать? Изменение дескриптора и повторное развертывание приложения каждый раз при создании нового источника данных не является вариантом.

Извините, если вопрос не имеет 100% смысла, довольно сложно донести мысль.


person guyumu    schedule 10.06.2010    source источник


Ответы (2)


Можно ли с помощью JPA выбирать во время выполнения источник данных, который будет использоваться для выполнения запроса, и возвращать тот же тип компонента управления данными?

Вы не можете изменить источник данных единицы сохраняемости во время выполнения. Однако вы можете настроить несколько единиц персистентности и использовать тот или иной EntityManagerFactory. Возможно, JPA не подходит для вашего случая использования.

Изменение дескриптора и повторное развертывание приложения каждый раз при создании нового источника данных не является вариантом.

И как приложение будет знать о «доступных источниках данных»?

person Pascal Thivent    schedule 10.06.2010
comment
Спасибо, вы правы, JPA здесь не подойдет. Я надеялся, что это не так. Под вторым вопросом я имел в виду, что в контейнере j2ee будут настроены все источники данных, а в самом приложении — нет. Но это не будет иметь большого значения, если я уйду из JPA. Спасибо. - person guyumu; 10.06.2010
comment
Это неправильно. Вы можете изменить источник данных единицы сохраняемости во время выполнения. После изменения любой созданный в дальнейшем EntityManagerFactory будет иметь новый источник данных. См. мой ответ о том, как это сделать. - person Julien Kronegg; 16.01.2014

Вы можете изменить источник данных JPA во время выполнения, но этот подход сложен (самоанализ, специфика реализации JPA,...).

Я реализовал свою собственную реализацию javax.persistence.spi.PersistenceProvider, которая переопределяет org.hibernate.ejb.HibernatePersistence и устанавливает источник данных как в Map, так и в PersistenceUnitInfo из PersistenceProvider непосредственно перед созданием EntityManagerFactory. Таким образом, мой EntityManagerFactory имеет источник данных, настроенный во время выполнения. Я храню свой EntityManagerFactory до тех пор, пока приложение не будет развернуто.

Вы можете использовать тот же подход и создать N разных EntityManagerFactory, каждый со своим конкретным источником данных. Однако имейте в виду, что каждый ÈntityManagerFactory использует много памяти.

person Julien Kronegg    schedule 16.01.2014