0

我有两个数据库使用相同的方案。

我的 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>
4

1 回答 1

0

不,您需要有两个 sessionFactories。SessionFactory 管理二级缓存——如果来自两个不同来源的数据组合在二级缓存中,这将导致问题。

如果不使用二级缓存,可以考虑使用spring提供 的“动态数据源路由”支持,在运行时切换底层数据源。

仅当两个数据源具有相同的架构(这似乎是您的情况)时,这才有效。

于 2013-11-18T06:50:11.963 回答