Multi Tenancy in JdbcTemplate

Viewed 515

I am using JdbcTemplate in my Project and we have requirement of implementing multi tenancy in our project.

Right now we are just creating a bean of DataSource and then injecting that datasource to jdbtemplate like

@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);
}

But after having multi tenancy we need to connect to the different schema according to the parameter in the request.

Can anyone tell how i can do this with jdbctemplate?

1 Answers

You can create a Bean like this and that will allocate the different schema based on the data source:

    @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;
    }

In case, you would like to make databases for the new tenant, just uncomment the line inside the bean

Related