Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring JdbcTemplate中的多租户_Spring_Spring Boot_Spring Jdbc_Jdbctemplate - Fatal编程技术网

Spring JdbcTemplate中的多租户

Spring JdbcTemplate中的多租户,spring,spring-boot,spring-jdbc,jdbctemplate,Spring,Spring Boot,Spring Jdbc,Jdbctemplate,我在我的项目中使用JdbcTemplate,我们需要在项目中实现多租户 现在我们只是创建一个数据源bean,然后将该数据源注入jdbtemplate,就像 @Bean public DataSource dataSource() { final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup(); dsLookup.setResourceRef(true); return dsLookup.getDataS

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

现在我们只是创建一个数据源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
public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
Map jpaPropertiesMap=createJpaPropertiesMap();
LocalContainerEntityManagerFactoryBean factoryBean=新的LocalContainerEntityManagerFactoryBean();
setDataSource(dataSource);
setPackagesToScan(“com.example.multi*”;
setJpaVendorAdapter(jpaVendorAdapter());
setjpapPropertyMap(jpapPropertiesMap);
返回factoryBean;
}
私有映射CreateJPapPropertiesMap(){
Map jpaPropertiesMap=newhashmap(jpaProperties.getProperties());
jpapPropertiesMap.put(Environment.MULTI_-TENANT,MULTI-tenancystategy.SCHEMA);
//jpaPropertiesMap.put(Environment.MULTI_-TENANT,MULTI-tenancystategy.DATABASE);
jpaPropertiesMap.put(Environment.MULTI_TENANT_CONNECTION_PROVIDER,tenantConnectionProvider);
jpapPropertiesMap.put(Environment.MULTI_TENANT_IDENTIFIER_RESOLVER,currentTenantIdentifier);
jpaPropertiesMap.put(Environment.FORMAT_SQL,true);
jpaPropertiesMap.put(Environment.SHOW_SQL,true);
返回JPapPropertiesMap;
}

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

此解决方案是否需要JPA?我不认为OP正在使用这个方法。@Edward这个解决方案需要JPA