Вопрос по hibernate, jpa, java, jboss, spring – Использование Spring, JPA с Hibernate для доступа к нескольким базам данных / источникам данных, настроенным в Jboss

3

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

Для простоты предположим, что есть запрос на поиск товара. Приложение должно выполнить поиск сведений о продукте в базе данных Live и, если оно не найдено, проверит базу данных архива.

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

Выше, вероятно, выполнимо, но мне интересно, есть ли лучший способ сделать это. Например, возможно ли, чтобы приложение работало на одном источнике данных, хотя за кадром оно фактически работает с двумя базами данных?

Приложение основано на базе данных Spring, JPA / Hibernate, SOAP и Mysql и Jboss 7 в качестве сервера приложений.

Любые примеры, показывающие, как это настраивается с использованием Spring и Jboss, были бы очень полезны.

Спасибо

Не могли бы вы добавить источник, если вам удалось решить эту проблему с помощью AbstractRoutingDataSource? Vedran

Ваш Ответ

1   ответ
6

AbstractRoutingDataSource, Увидетьэтот блог о том, как его использовать. В вашем случае вам необходимо переключать источник данных во время одного запроса, поэтому вам потребуется 2 транзакции, переключая источник данных между ними, изменяя индикатор источника данных наThreadLocal:

For these DAOs, demarcate the wrapping Service-layer either with distinct packages, class names, or method names Indicate to Spring that the Service-layer method calls should run in their own transactional contexts by annotating with @Transactional(propogation=Propogation.REQUIRES_NEW) Create an Aspect (using AspectJ annotation @Aspect) to fire around the service-layer method calls (using @Around) to set the ThreadLocal value before the method call, and to unset it afterwards In the @Controller, simply call the Service-layer methods. The Aspect will take care of setting the values to indicate which datasource to use, and the AbstractRoutingDataSource will use that datasource in the context of each transaction.

Похожие вопросы