2009-05-13 3 views
14

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

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

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

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

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

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

+0

Этот вопрос очень похож на этот: http://stackoverflow.com/questions/281247/nhibernate-one-base-class-several-mappings –

ответ

8

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

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

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

+0

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

+0

@NieldeWet: транзакции с несколькими источниками данных - это совершенно разные баллы. Распределенные транзакции сложны. Для этого вам нужна полная реализация JTA-приложений в JavaEE, и затем вы используете JtaTransactionManager Spring для интеграции с вашим приложением. – skaffman

24

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

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

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

+0

Правильно ли это, если во время выполнения имеется только один активный источник данных?В моем случае мы поддерживаем 2 dbms для разных клиентов, но только 1 сервер каждый –

+1

Вероятно, нет, нет. Вы хотите настроить URL JDBC через Spring PropertyPlaceholderConfigurer. Вы могли бы прочитать его из файла свойств или даже переменной среды. –

+0

Это в значительной степени то, что я сделал в конце. Я указал свойство, которое использовалось для выбора того, какой компонент использовался в качестве источника данных. Я разместил его [здесь] (http://stackoverflow.com/questions/23915154/using-sqlserverconnectionpooldatasource-in-spring/23993098#23993098) –

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