2013-11-18 3 views
0

У меня две базы данных по той же схеме.Несколько менеджеров транзакций за один сеансFactory

Приложение 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 
} 

менеджеры trnsaction:

<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> 

ответ

0

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

Если вы не используете кеш второго уровня, вы можете использовать поддержку «Dynamic data source routing», предоставляемую пружиной, чтобы переключить базовый источник данных во время выполнения.

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