暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

记一次使用shardingsphere出现的头疼情况

Java技术学习笔记 2020-12-29
2215

基础架包

<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);
// 打印sql
Properties 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论