【问题标题】:Multi Tenancy in JdbcTemplateJdbcTemplate 中的多租户
【发布时间】:2021-02-15 02:08:22
【问题描述】:

我在我的项目中使用 JdbcTemplate,我们需要在我们的项目中实现多租户。

现在我们只是创建一个 DataSource 的 bean,然后将该数据源注入到 jdbtemplate 中

@Bean
public DataSource dataSource() {
    final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();
    dsLookup.setResourceRef(true);
    return dsLookup.getDataSource("path");

}

@Bean
public NamedParameterJdbcTemplate jdbcTemplate(DataSource dataSource) {
    JdbcTemplate template = new JdbcTemplate(dataSource);
    return new NamedParameterJdbcTemplate(template);
}

但是在多租户之后,我们需要根据请求中的参数连接到不同的架构。

谁能告诉我如何用 jdbctemplate 做到这一点?

【问题讨论】:

    标签: spring spring-boot spring-jdbc jdbctemplate


    【解决方案1】:

    您可以像这样创建一个 Bean,它将根据数据源分配不同的架构:

        @Bean
        public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    
            Map<String, Object> jpaPropertiesMap = createJpaPropertiesMap();
    
            LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
    
            factoryBean.setDataSource(dataSource);
            factoryBean.setPackagesToScan("com.example.multi*");
            factoryBean.setJpaVendorAdapter(jpaVendorAdapter());
            factoryBean.setJpaPropertyMap(jpaPropertiesMap);
    
            return factoryBean;
        }
    
    private Map<String, Object> createJpaPropertiesMap() {
    
            Map<String, Object> jpaPropertiesMap = new HashMap<>(jpaProperties.getProperties());
    
    
            jpaPropertiesMap.put(Environment.MULTI_TENANT, MultiTenancyStrategy.SCHEMA);
            // jpaPropertiesMap.put(Environment.MULTI_TENANT, MultiTenancyStrategy.DATABASE);
    
            jpaPropertiesMap.put(Environment.MULTI_TENANT_CONNECTION_PROVIDER, tenantConnectionProvider);
            jpaPropertiesMap.put(Environment.MULTI_TENANT_IDENTIFIER_RESOLVER, currentTenantIdentifier);
    
    
            jpaPropertiesMap.put(Environment.FORMAT_SQL, true);
            jpaPropertiesMap.put(Environment.SHOW_SQL, true);
    
            return jpaPropertiesMap;
        }
    

    如果您想为新租户创建数据库,只需取消注释 bean 内的行

    【讨论】:

    • 此解决方案是否需要 JPA?我不认为 OP 正在使用它。
    • @Edward 这个解决方案需要 JPA
    猜你喜欢
    • 2019-03-03
    • 2020-11-27
    • 2018-05-07
    • 1970-01-01
    • 2021-02-15
    • 2018-03-28
    • 2015-11-03
    • 2013-05-28
    • 1970-01-01
    相关资源
    最近更新 更多