多租户应用程序的动态数据源注册

时间:2016-08-25 21:56:48

标签: java spring multi-tenant liquibase

我试图在我的项目中实现具有数据库分离的多租户架构。一切看起来都很好,但我想在运行时添加新的租户,而且我坚持使用它。 我在我的项目中使用liquibase,当添加租户时,必须在运行时发生三件事:

  1. 创建新数据库

  2. 创建新的DataSource Bean

  3. 使用liquibase更新数据库

  4. 使用SpringLiquibase Bean创建和更新我新创建的数据库没有问题。我正在做这样的事情:

    public void registerTenantBean(String tenantName){
       BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) applicationContext.getAutowireCapableBeanFactory();
       Properties properties = ... //set my properties
       DataSourceBuilder dataSourceBuilder = new DataSourceBuilder(this.getClass().getClassLoader())
                .driverClassName(properties.getDriverClassName())
                .url(properties.getUrl())
                .username(properties.getUsername())
                .password(properties.getPassword());
       DataSource ds = dataSourceBuilder.build();
       BeanDefinition liquibaseDefinition = BeanDefinitionBuilder
                .genericBeanDefinition(TenantLiquibase.class)
                .addConstructorArgReference(ds)
                .setScope(BeanDefinition.SCOPE_SINGLETON)
                .getBeanDefinition();
        beanFactory.registerBeanDefinition(tenantName + "LiquibaseBean", liquibaseDefinition);
    }
    

    我的TenantLiquibase简单地说:

    public class TenantLiquibase extends SpringLiquibase {
      public TenantLiquibase(DataSource dataSource) {
        super.setDataSource(dataSource);
        super.setChangeLog("classpath:/db/changelog/db.changelog-master.json");
      }
    }
    

    这很好用,但我不知道如何将我的数据源ds注册为Spring IoC的数据源配置属性。是否有可能以某种方式在这个代码处做到这一点?

0 个答案:

没有答案
相关问题