Несколько менеджеров транзакций для одной сессии

У меня две базы данных по одной и той же схеме.

В моем приложении hibernate 3.2/Spring 3 есть один источник данных (через jndi) для каждой базы данных и один менеджер транзакций (HibernateTransactionManager) для каждого источника данных.

Вопрос: Могу ли я использовать один экземпляр фабрики сеансов, который должен использовать источник данных, связанный с текущей транзакцией?

Предположим, есть следующие методы.

@Transactional(readOnly = true, value = "tmDBOne")
public String db1() throws IOException {
    dao.execute(); // dao uses injected session factory
}


@Transactional(readOnly = true, value = "tmDBTwo")
public void db2() throws IOException {
    dao.execute(); // dao uses injected session factory
}

Менеджеры по операциям:

<bean id="tmDBOne"
      class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="dataSource" ref="dsDBOne/>
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<bean id="tmDBTwo"
      class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="dataSource" ref="dsDBTwo/>
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

1 ответ

Решение

Нет, вам нужно иметь две фабрики сессии. SessionFactory управляет кэшем второго уровня - если данные из двух разных источников объединяются в кэше второго уровня, что приведет к проблемам.

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

Это будет работать только в том случае, если оба источника данных имеют одинаковую схему (что, кажется, в вашем случае) .

Другие вопросы по тегам