5

我用的是spring mvc+hibernate+两个数据库

例如:我创建了 2 个 sessionFactories。sessionFactory1(使用datasource1)和sessionFactory2(使用datasource2)。

是否可以在运行时更改sessionFactory1或更改sessionFactory2sessionFactory 以便 dao/s 引用它们。sessionFactory 已经自动连接到所有 dao/s。

我现在正在寻找它,我认为@Configuration 可以帮助我,但我不确定。

我正在尝试 AbstractRoutingDataSource 但认为它没有帮助。

4

2 回答 2

2

通常 Spring 在应用程序启动时连接您的 bean,因此“重新连接”(在运行时用对 sessionFactory2 的引用替换对 sessionFactory1 的引用)似乎并不容易实现。

也许您可以实现一个连接到您的 DAO 对象的“代理 bean”,并更改您的代理 bean 的“目标 SessionFactory”。

于 2012-08-30T17:14:36.803 回答
0

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();
    }

}

您需要创建一个扩展该类并实现确定CurrentLookupKey() 的类,并返回您在上下文持有者中拥有的当前数据库:

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/中的示例。它对我来说很好。

于 2012-10-03T04:38:33.023 回答