基础架包
<dependency><groupId>io.shardingsphere</groupId><artifactId>sharding-jdbc-spring</artifactId><version>3.0.0</version></dependency>
任务需求:
1.多个数据源2.其中两个数据源支持分表,另外一个数据源不需要分表3.其中支持分表的两个数据库中表没有重复的(垂直分表)不知道是否可以根据表明来路由的,只有根据表数据中指定字段来路由。
1、主从复制的两个数据源配置方式:(没什么问题)
@Bean(name="dataSource0")@ConfigurationProperties(prefix = "spring.datasource.master-0")public DataSource dataSource0(){return new DruidDataSource();}@Bean(name="dataSource1")@ConfigurationProperties(prefix = "spring.datasource.slave-0")public DataSource dataSource1(){return new DruidDataSource();}@Bean(name = "shardingDataSource")public DataSource dataSource(DataSource stockDataSource, DataSource orderDataSource) throws SQLException {Map<String, DataSource> dataSourceMap = new HashMap<>(); //设置分库映射dataSourceMap.put("dataSource0", stockDataSource);dataSourceMap.put("dataSource1", orderDataSource);//2、分库分表配置ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();// 配置表规则shardingRuleConfig.getTableRuleConfigs().addAll(getTableRuleConfiguration());//2.5、配置默认分表规则// shardingRuleConfig.setDefaultTableShardingStrategyConfig(new HintShardingStrategyConfiguration(new DatasourceRoutingAlgorithm()));//2.6、配置默认分库规则(不配置分库规则,则只采用分表规则)// shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new HintShardingStrategyConfiguration(new DatasourceRoutingAlgorithm()));//2.7、配置默认数据源shardingRuleConfig.setDefaultDataSourceName("dataSource0");Map<String, Object> dataSourceNames = new HashMap<>();dataSourceNames.put("dataSource0", "dataSource0");dataSourceNames.put("dataSource1", "dataSource1");// 主从MasterSlaveRuleConfiguration masterSlaveRule = new MasterSlaveRuleConfiguration();masterSlaveRule.setName("ds_0");//主从规则的名称,此名称随意起masterSlaveRule.setMasterDataSourceName("dataSource0");//主数据源名称,和createDataSourceMap对象masterSlaveRule.setSlaveDataSourceNames(Arrays.asList("dataSource1"));shardingRuleConfig.getMasterSlaveRuleConfigs().add(masterSlaveRule);// 打印sqlProperties prop = new Properties();prop.setProperty(ShardingPropertiesConstant.SQL_SHOW.getKey(), String.valueOf(Boolean.TRUE));DataSource dataSource = ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, dataSourceNames, prop);return dataSource;}
总结:
getTableRuleConfiguration()中只定义了部分支持分表的配置;
主从复制的两个数据源,未配置分表规则的,会自动取单表,可以完美实现。
2、多数据源、分表的配置方式(仿照单表的写,未能实现)
@Bean(name = "dataSource1")@ConfigurationProperties(prefix = "spring.datasource.slave-1")public DataSource stockDataSource() {return new DruidDataSource();}@Bean(name = "dataSource2")@ConfigurationProperties(prefix = "spring.datasource.slave-2")public DataSource orderDataSource() {return new DruidDataSource();}@Bean(name = "dataSource")public DataSource dataSource(DataSource dataSource1, DataSource dataSource2) throws SQLException {Map<String, DataSource> dataSourceMap = new HashMap<>(); //设置分库映射dataSourceMap.put("dataSource1", dataSource1);dataSourceMap.put("dataSource2", dataSource2);//2、分库分表配置ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();// 配置表规则shardingRuleConfig.getTableRuleConfigs().addAll(getTableRuleConfiguration());//2.5、配置默认分表规则// shardingRuleConfig.setDefaultTableShardingStrategyConfig(new HintShardingStrategyConfiguration(new DatasourceRoutingAlgorithm()));//2.6、配置默认分库规则(不配置分库规则,则只采用分表规则)// shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new HintShardingStrategyConfiguration(new DatasourceRoutingAlgorithm()));//2.7、配置默认数据源shardingRuleConfig.setDefaultDataSourceName("dataSource1");Map<String, Object> dataSourceNames = new HashMap<>();dataSourceNames.put("dataSource1", "dataSource1");dataSourceNames.put("dataSource2", "dataSource2");Properties prop = new Properties();prop.setProperty(ShardingPropertiesConstant.SQL_SHOW.getKey(), String.valueOf(Boolean.TRUE));DataSource dataSource = ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, dataSourceNames, prop);return dataSource;}
出现问题:
1.在getTableRuleConfiguration()方法配置的可以找到对应的表,毫无问题
2.未配置在getTableRuleConfiguration()中,按照自己的想法,应该可以自动找到对应的数据源,但是找不到.
其实仔细想也确实应该找不到,即使MapperScan指定数据源、目录,还是找不到。
解决方法:getTableRuleConfiguration中增加不需要配置的表,主要是让库与表绑定.
3.在网络上找到的解决方法有:用切面来更具不同mapper更换数据源,但是测试得知:库可以切换,但是分表失效了。
3.在2的基础上我也增加另外一个数据源
@Bean(name = "dataSource3")@ConfigurationProperties(prefix = "spring.datasource.kafka-master-0")public DataSource dataSource5() {return new DruidDataSource();}@Bean(name = "commonSqlSessionFactory")public SqlSessionFactory commonSqlSessionFactory() throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml"));bean.setDataSource(dataSource5());return bean.getObject();}@Bean(name="commonSqlSessionTemplate")public SqlSessionTemplate basisSqlSessionTemplate(@Qualifier("commonSqlSessionFactory") SqlSessionFactory sqlBasisSessionFactory) throws Exception {return new SqlSessionTemplate(sqlBasisSessionFactory);}//@MapperScan(basePackages = {"com.qianjing.hmy.report.common.mapper"}, sqlSessionTemplateRef = "commonSqlSessionTemplate")
访问也毫无问题。
文章转载自Java技术学习笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




