我有两个数据库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>
答案 0 :(得分:0)
不,你需要有两个sessionFactories。 SessionFactory管理二级缓存 - 如果来自两个不同来源的数据在二级缓存中合并将导致问题。
如果您不使用二级缓存,可以考虑使用spring提供的“Dynamic data source routing”支持在运行时切换基础数据源。
仅当两个数据源具有相同的模式(在您的情况下似乎是这样)时,这才有效。