JdbcTemplate中的多租户

问题描述

我在我的项目中使用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做到这一点?

解决方法

您可以像这样创建一个 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 内的行