我想用shardingsphere4.1.1的版本做多数据源配置,但是这些数据库都是不同业务的数据库,也就是表结构不一样
问题1:我现在不知道怎么配置才能指定某个数据库使用shardingsphere做分库逻辑,其他数据库使用spring.datasource初始化数据库
问题2:若只使用shardingsphere初始化多个数据源,在同一个业务中有跨库查询时,是否每个表都要指定数据源,不是要怎么处理
配置代码
spring加载的数据源配置
@Configuration
@ConditionalOnProperty(name = "datasource.memberCareDataSource.jdbc-url")
public class CommentDataSourceConfiguration {
@Bean("commentDataSource")
public static DataSource commentDataSource(MultipleDataSourceConfig multipleDataSourceConfig, JasyptConfig jasyptConfig) {
HikariDataSource hikariDataSource = new HikariDataSource();
BeanUtils.copyProperties(multipleDataSourceConfig.getMemberCareDataSource(), hikariDataSource);
hikariDataSource.setUsername(JasyptUtil.decryption(hikariDataSource.getUsername(), jasyptConfig.getPassword()));
hikariDataSource.setPassword(JasyptUtil.decryption(hikariDataSource.getPassword(), jasyptConfig.getPassword()));
return hikariDataSource;
}
@Bean("sqlSessionFactoryComment")
public static SqlSessionFactory sqlSessionFactoryComment(@Qualifier("commentDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setTypeAliasesPackage("com.hworld.crm.member.comment.repository.entity");
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
bean.setMapperLocations(resolver.getResources("classpath:/mapper/comment/*.xml"));
bean.setPlugins(DataSourceConfigurationHelper.getPageInterceptorArray());
return bean.getObject();
}
@Bean("commentScanner")
public static MapperScannerConfigurer commentScanner() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("com.hworld.crm.member.comment.repository.mapper");
mapperScannerConfigurer.setSqlSessionTemplateBeanName("commentSqlSessionTemplate");
return mapperScannerConfigurer;
}
@Bean("commentSqlSessionTemplate")
public static SqlSessionTemplate commentSqlSessionTemplate(@Qualifier("sqlSessionFactoryComment") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name = "commentDataSourceTransactionManager")
public static PlatformTransactionManager commentDataSourceTransactionManager(@Qualifier("commentDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
/**
* 切面拦截规则
*/
@Bean(name = "commentPointcutAdvisor")
public static AspectJExpressionPointcutAdvisor commentPointcutAdvisor(@Qualifier("commentDataSourceTransactionManager") PlatformTransactionManager transactionManager) {
AspectJExpressionPointcutAdvisor pointcutAdvisor = new AspectJExpressionPointcutAdvisor();
pointcutAdvisor.setAdvice(DataSourceConfigurationHelper.buildTransactionInterceptor(transactionManager));
pointcutAdvisor.setExpression("execution(public * com.hworld.crm.member.comment.biz..*.*(..))");
return pointcutAdvisor;
}
datasource:
globalDataSource:
type: com.zaxxer.hikari.HikariDataSource
jdbc-url: jdbc:mysql://testdb:55988/v31_cem_global_db?application_name=crm&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&autoReconnect=true
username: zLHZOYHf2FBeS9fEK5VsGw==
password: BG5GxsEhCDAectecwllh1L4mEGuGtNuN2k7YhPfnG/A=
driver-class-name: com.mysql.cj.jdbc.Driver
maximum-pool-size: 200
minimum-idle: 20
connection-timeout: 5000
connection-test-query: select 1
companyDataSource:
type: com.zaxxer.hikari.HikariDataSource
jdbc-url: jdbc:mysql://testdb:55988/v31_cem_company_db?application_name=crm&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&autoReconnect=true
username: zLHZOYHf2FBeS9fEK5VsGw==
password: BG5GxsEhCDAectecwllh1L4mEGuGtNuN2k7YhPfnG/A=
driver-class-name: com.mysql.cj.jdbc.Driver
maximum-pool-size: 200
minimum-idle: 20
connection-timeout: 5000
connection-test-query: select 1
spring:
shardingsphere:
props:
sql.show: true
datasource:
names: ds2,ds7
ds2:
type: com.zaxxer.hikari.HikariDataSource
jdbc-url: jdbc:mysql://testdb:55988/v31_cem_member_db?application_name=crm&serverTimezone=Asia/Shanghai&characterEncoding=utf-8
username: ug_cem
password: xyAnt3G40f5M5LeX
driver-class-name: com.mysql.cj.jdbc.Driver
maximum-pool-size: 200
minimum-idle: 20
connection-timeout: 5000
connection-test-query: select 1
ds7:
type: com.zaxxer.hikari.HikariDataSource
jdbc-url: jdbc:mysql://testdb:55988/v30_cem_member_db?application_name=crm&serverTimezone=Asia/Shanghai&characterEncoding=utf-8
username: ug_cem
password: xyAnt3G40f5M5LeX
driver-class-name: com.mysql.cj.jdbc.Driver
maximum-pool-size: 200
minimum-idle: 20
connection-timeout: 5000
connection-test-query: select 1
我尝试过
1.spring原生数据源初始化所有,shardingsphere初始化部分。查询时不走shardingsphere初始化的数据源
2.spring和shardingsphere同时加载部分,会有循环引用的问题
3.只用shardingsphere初始化多数据源配置,查询时,跨库查询会出现当前库不存在另一个表的情况
如果只是切换数据源,mybatis plus有个依赖可以直接搞定,或者AbstractRoutingDataSource,你非要用这个也行,就考验你grovvy的能力了,能不能写出够用的表达式来