我正在使用spring mvc + hibernate +两个数据库
因此,例如:
我创建了2个sessionFactories。 sessionFactory1
(使用datasource1
)和sessionFactory2
(使用datasource2
)。
是否可以在运行时将sessionFactory1
或sessionFactory2
更改为sessionFactory,以便dao/s引用它们。 sessionFactory已经自动连接到所有dao/s。
我现在正在搜索它,我认为@Configuration可以帮助我,但不确定。
我正在尝试AbstractRoutingDataSource,但认为它没有帮助。
最佳答案
AbstractRoutingDataSource将为您工作。
首先,您需要创建一个类,该类将存储正在使用的当前数据库:
public class MyContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
public static void setDBContext(String dBContext) {
contextHolder.set(dBContext);
}
public static String getDBContext() {
return (String) contextHolder.get();
}
public static void clearDBContext() {
contextHolder.remove();
}
}
您将需要创建一个扩展该类并实现defineCurrentLookupKey()的类,并返回您在上下文持有者中拥有的当前数据库:
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class MyRoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return MyContextHolder.getDBContext();
}
}
请参阅http://blog.springsource.org/2007/01/23/dynamic-datasource-routing/中的示例。
对我来说很好。