【问题标题】:Change bean property/value during runtime in spring在 spring 运行时更改 bean 属性/值
【发布时间】:2011-11-10 10:51:08
【问题描述】:

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

例如: 我创建了 2 个会话工厂。 sessionFactory1(使用datasource1)和sessionFactory2(使用datasource2)。

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

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

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

【问题讨论】:

标签: java hibernate spring multiple-databases


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-01-23
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 2017-03-17
      相关资源
      最近更新 更多