一个sessionFactory的几个事务管理器

时间:2013-11-18 06:26:24

标签: java spring hibernate sessionfactory transactionmanager

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

我的hibernate 3.2 / Spring 3应用程序为每个数据库提供一个数据源(通过jndi),为每个数据源提供一个transactino管理器(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 个答案:

答案 0 :(得分:0)

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

如果您不使用二级缓存,可以考虑使用spring提供的“Dynamic data source routing”支持在运行时切换基础数据源。

仅当两个数据源具有相同的模式(在您的情况下似乎是这样)时,这才有效。