Несколько менеджеров транзакций для одной сессии
У меня две базы данных по одной и той же схеме.
В моем приложении 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, для переключения базового источника данных во время выполнения.
Это будет работать только в том случае, если оба источника данных имеют одинаковую схему (что, кажется, в вашем случае) .