在spring中运行时更改bean属性/值

时间:2011-11-10 10:51:09

标签: java hibernate spring multiple-databases

我正在使用spring mvc + hibernate +两个数据库

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

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

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

我正在尝试使用AbstractRoutingDataSource但不认为它会有所帮助。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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();
    }

}

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

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