问题描述
我在我的项目中使用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 内的行