创建类并实现接口、创建配置信息(指定强制路由的库:五种分片策略)、添加测试类

1、创建自定义的分配类

  1. package com.slin.hint;
  2. import org.apache.shardingsphere.api.sharding.hint.HintShardingAlgorithm;
  3. import org.apache.shardingsphere.api.sharding.hint.HintShardingValue;
  4. import java.util.ArrayList;
  5. import java.util.Collection;
  6. public class MyHintShardingAlgorithm implements HintShardingAlgorithm<Long> {
  7. @Override
  8. public Collection<String> doSharding(
  9. Collection<String> collection, // 对那些数据表进行分片
  10. HintShardingValue<Long> hintShardingValue) {// 具体的分配值
  11. Collection<String> result =new ArrayList<>();
  12. // 循环对谁进行分片
  13. for(String each: collection){
  14. // 循环拿到分片键的值
  15. for (Long value: hintShardingValue.getValues()){
  16. //如果满足指定的条件,就将结果返回回去进行路由操作
  17. if(each.endsWith(String.valueOf(value % 2))){
  18. //如果ds0满足了,则就会路由到ds0这个库中
  19. result.add(each);
  20. }
  21. }
  22. }
  23. return result;
  24. }
  25. }

2、创建并添加配置信息

a、主配置文件,指向新的配置文件

在resource包下面创建application-hint-database.properties配置文件
image.png

b、给新建的文件添加信息

image.png

完整的配置信息如下

  1. ######datasource(数据源,有两个库)#######
  2. spring.shardingsphere.datasource.names=ds0,ds1
  3. ######配置第一个库#######
  4. #使用连接池
  5. spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource
  6. #使用驱动
  7. spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
  8. #数据库连接(如果是服务器的就只需要把localhost改为服务器的ip即可)
  9. spring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://localhost:3306/lagou1
  10. #数据库用户和密码
  11. spring.shardingsphere.datasource.ds0.username=root
  12. spring.shardingsphere.datasource.ds0.password=root
  13. ######配置第二个库#######
  14. spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource
  15. spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
  16. spring.shardingsphere.datasource.ds1.jdbc-url=jdbc:mysql://localhost:3306/lagou2
  17. spring.shardingsphere.datasource.ds1.username=root
  18. spring.shardingsphere.datasource.ds1.password=root
  19. ######配置自定义的强制路由类使用是(包名.类名 )#####hint
  20. spring.shardingsphere.sharding.tables.city.database-strategy.hint.algorithm-class-name=com.slin.hint.MyHintShardingAlgorithm

3、添加测试

package com.slin.test;

import com.slin.RunBoot;
import com.slin.entity.City;
import com.slin.repository.CityRepository;
import org.apache.shardingsphere.api.hint.HintManager;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.util.List;

//通过它来启动
@RunWith(SpringRunner.class)
//通过RunBoot来创建boot容器
@SpringBootTest(classes = RunBoot.class)
public class HintShardingAlgorithmTest {

    @Resource
    private CityRepository cityRepository;

    @Test
    public void HintDBTest(){
        HintManager hinstance = HintManager.getInstance();
        //指定路由库用set、如果是路由库的表用add
        // 强制路由到ds0库中
        hinstance.setDatabaseShardingValue(0L);
        List<City> all = cityRepository.findAll();
        System.out.println("**************start********************");
        all.forEach(city -> {
            System.out.println(city.getId()+" "+city.getName()+" "+city.getProvince());
        });

        System.out.println("**************end********************");
    }
}

4、展示结果

从主库lagou1也就是ds0中查询出的结果和数据库的结果一致
image.png
image.png
总结:主要和强制指定的那个库、以及自定义的路由算法
强制路由库和表也可以按照同样的思路去做即可