Hibernate + Spring с использованием нескольких источников данных? - PullRequest
14 голосов
/ 14 мая 2009

Я работаю над веб-приложением, которое использует Spring MVC 2.5 и Hibernate.

Одним из требований приложения является то, что оно должно иметь возможность экспортировать некоторые объекты во внешнюю базу данных. Я полагаю, что я мог бы также использовать существующий слой данных и просто сохранить объекты во внешний источник.

Я новичок в Spring и Hibernate, и думаю, мне просто интересно, как мне к этому подойти. Прямо сейчас все автоматически подключается через аннотации. Я предполагаю, что мне нужно будет создать новый bean-компонент dataSource, новый sessionFactory и TransactionManager ... возможно ... но ...

  1. Я хочу, чтобы подключение к внешнему источнику данных было доступно, только когда пользователь специально "экспортирует".

  2. Не помешает ли мне автопроводка? Как я могу сказать Spring, чтобы внедрить соответствующий sessionFactory, когда я создаю DAO для моего процесса экспорта? (Я автоматически подключаюсь через конструкторы) Должен ли я программно создавать свою фабрику сессий (и т. Д.), А затем вручную создавать мой DAO? Если это так, будет ли это «переопределять» аннотацию autowire?

Полагаю, мне не нужны ответы на вышеуказанные вопросы, в частности, если кто-то может просто провести меня через базовый процесс, чтобы заставить что-то подобное работать. Спасибо!

Ответы [ 2 ]

25 голосов
/ 15 мая 2009

Spring, к счастью, уже имеет решение для этого: AbstractRoutingDataSource. Он в основном действует как Фасад для нескольких источников данных и позволяет вам создавать его подклассы и реализовывать любую логику, необходимую для решения, какой источник данных следует использовать. Некоторые подробности здесь:

http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/

Это позволяет обрабатывать логику поиска в DataSource точно в одном месте. Ваш слой DAO и SessionFactory не нужно настраивать, за исключением того, что вам нужно внедрить свой подкласс AbstractRoutingDataSource в Hibernate SessionFactory.

8 голосов
/ 14 мая 2009

Конфигурирование нескольких источников данных и сеансовых фабрик в контексте Spring само по себе не будет проблемой, но делает автопроводку менее привлекательной.

Вы можете использовать аннотацию @Qualifier, чтобы указать автопроводку, какой из них выбрать, но я бы предложил не использовать автопроводку, а вместо этого явно ввести правильный источник данных и фабрику сеанса, используя <property> или <constructor-arg>.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...