Подтвердить что ты не робот

Hibernate + Spring с использованием нескольких источников данных?

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

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

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

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

  • Будет ли автоувеличивание мешать мне? Как я могу сказать Spring для ввода соответствующего sessionFactory, когда я создаю DAO для моего процесса экспорта? (Я могу авторизовать через конструкторы) Должен ли я программно создать сеанс factory (и т.д.), А затем вручную создать экземпляр моего DAO? Если это так, будет ли это "отменять" аннотацию автосогласования?

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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