不,您需要两个sessionFactory。SessionFactory管理二级缓存——如果来自两个不同来源的数据在二级缓存中合并,将导致问题。
我有两个数据库,它们的方案相同。
我的hibernate 3.2/Spring 3应用程序为每个数据库有一个数据源(通过jndi),为每个数据源有一个transactionno管理器(hibernate TransactionManager)。
问题:我可以使用会话工厂的一个实例吗?该实例应该使用与当前事务关联的数据源?
假设有以下方法。
@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>
如果您不使用二级缓存,可以考虑在运行时使用spring提供的"动态数据源路由"支持来切换底层数据源。
只有当两个数据源都具有相同的模式(在您的情况下似乎是这样)时,这才会起作用。