Использование 2 разных соединений с базой данных в Spring-Hibernate - PullRequest
2 голосов
/ 23 февраля 2012

У меня есть 2 отдельных модуля в отдельных .jars, которые работают с 2 различными базами данных.

Файлы applicationContext-hibernate.xml содержат уникальные имена для фабрик сессий, и web.xml загружает (должен ли я загрузить? Надеюсь, что так) файлы context.xml. Я также определил одно из пользовательских имен sessionFactory в web.xml, как вы можете видеть здесь:

web.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:/applicationContext-hibernate.xml</param-value>
</context-param>
[...]
<filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>
        org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
    </filter-class>
    <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>customsessionFactory</param-value>
    </init-param>
</filter>

Итак, первое соединение с базой данных работает как задумано. Но как мне добавить второй? Только один из компонентов базы данных доступен из контекста (конечно, так как другой не добавлен)

Я нашел только " Как обрабатывать несколько соединений с базами данных, используя фабрики сеансов с Spring и Hibernate ", но я не понимаю ответа там.

Ответы [ 5 ]

4 голосов
/ 29 февраля 2012

до тех пор, пока вы определили 2 sessionFactories с разными идентификаторами. Вы можете передать путь 2-го XML-файла, разделяя его запятой

<param-value>classpath*:/applicationContext-hibernate.xml, <<2nd file reference>></param-value>

Как только вы настроите эту настройку .. Spring сможет запустить 2 sessionFactories ..

- Вариант 1

вам нужно создать 2 экземпляра hibernateTemplate (по одному для каждой фабрики сессий) и внедрить их оба в ваш DAO, таким образом вы можете использовать hibernatetemplate для работы с несколькими sessionFactories.

- Вариант 2

при работе с HibernateDaoSupport вы можете использовать метод createHibernateTemplate(sesionFactoryReference) для создания объекта шаблона с определенной sessionFactory.

3 голосов
/ 27 февраля 2012

Если я правильно понимаю, у вас есть два файла с одинаковым именем (и пакетом) в двух банках в classpath, и вы надеетесь, что ClassLoader загрузит оба.

Нет способа для этого: когда ClassLoader запрашивают загрузку ресурса по имени, он сканирует все jar-файлы и каталоги в своем пути к классам по порядку и возвращает первый ресурс, найденный с этим именем.

Вы должны присвоить своим контекстным файлам другое имя (или пакет) и загрузить их оба. Если вы хотите, чтобы оба сеанса открывались в поле зрения, вам также придется объявить два разных фильтра.

2 голосов
/ 29 февраля 2012

, так как вы уже используете Spring и Hibernate, если вы используете JPA и отображение Hibernate, вы можете определить 2 различных менеджера сущностей в контексте XML Spring, и когда вы внедряете менеджер сущностей в свой слой DAO, вы можете внедрять, используя сущность Имя менеджера. Таким образом, вы можете общаться с несколькими подключениями к базе данных. Я настроил это сам ранее.

Ниже приведена ссылка, которую я получил при поиске в Интернете, но именно это я и сделал http://viralpatel.net/blogs/2011/01/spring-roo-two-database-configuration.html

1 голос
/ 02 марта 2012

Если вы можете перейти на Hibernate 4, вы можете установить флажок Мультитенантность в Hibernate , но это требует перехода на Spring 3.1, что может вызвать другие проблемы.

1 голос
/ 28 февраля 2012

Обычный способ сделать это с помощью Spring - это иметь несколько файлов контекста. Если вы хотите убедиться, что оба найдены, поместите их в разные пакеты.

Убедитесь, что ваши бобы названы уникально, например, каждый SessionFactory бин должен иметь уникальный идентификатор, иначе они будут перезаписывать друг друга.

Вот подсказка для выяснения, загружены ли они и созданы ли Spring: включите ведение журнала на уровне отладки для Spring (например, в Log4J ), Spring покажет, какие файлы и компоненты он загружает и создает. Это действительно полезно.

Если оба источника данных должны использоваться в одной транзакции, убедитесь, что вы используете TransactionManager, предпочтительно также XA (двухфазное принятие). При работе с несколькими источниками данных я обычно заставляю Spring предоставлять разграничение транзакций на уровне сервиса. Внутри метода service все выполняется в одной транзакции, и я могу использовать несколько источников данных.

Другая альтернатива, если обе схемы находятся в одной и той же базе данных, - это настроить Hibernate для подключения к одной схеме и доступа к таблице второй схемы через первую. Вы можете сделать это в Oracle, используя гранты и синонимы. Это вариант для вас, или вам действительно нужно подключиться к двум разным базам данных?

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