sharding-jdbc在目前微服务和各种saas软件等数据量日益加大的状况下变得应用的人多了起来。

sharding-jdbc读写拆散测试

数据库实体

@Data@Table(name = "city")@Entitypublic class City implements Serializable {    @Id    @Column(name = "id")    @GeneratedValue(strategy = GenerationType.IDENTITY)    private  Long id;    @Column(name = "name")    private String name;    @Column(name = "province")    private String province;}

Jpa操作类

public interface CityRepository extends JpaRepository<City,Long> {}

SpringBoot启动类

@SpringBootApplication@EnableTransactionManagementpublic class RunBoot {    public static void main(String[] args) {        SpringApplication.run(RunBoot.class,args);    }}

具体读写拆散配置

spring.shardingsphere.props.sql.show=truespring.shardingsphere.datasource.names=master,slave0spring.shardingsphere.datasource.master.type=com.zaxxer.hikari.HikariDataSourcespring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driverspring.shardingsphere.datasource.master.jdbc-url=jdbc:mysql://localhost:3306/test1spring.shardingsphere.datasource.master.username=rootspring.shardingsphere.datasource.master.password=351848327spring.shardingsphere.datasource.slave0.type=com.zaxxer.hikari.HikariDataSourcespring.shardingsphere.datasource.slave0.driver-class-name=com.mysql.jdbc.Driverspring.shardingsphere.datasource.slave0.jdbc-url=jdbc:mysql:/localhost:3306/test2spring.shardingsphere.datasource.slave0.username=rootspring.shardingsphere.datasource.slave0.password=351848327#master-slavespring.shardingsphere.masterslave.name=datasourcespring.shardingsphere.masterslave.master-data-source-name=masterspring.shardingsphere.masterslave.slave-data-source-names=slave0spring.shardingsphere.masterslave.load-balance-algorithm-type=ROUND_ROBINspring.shardingsphere.sharding.tables.city.key-generator.column=idspring.shardingsphere.sharding.tables.city.key-generator.type=SNOWFLAKE

测试类和办法

@RunWith(SpringRunner.class)@SpringBootTest(classes = RunBoot.class)public class TestMasterSlave {    @Resource    CityRepository cityRepository;    @Test    public  void testMasterSlave(){        City city = new City();        city.setName("shanghai");        city.setProvince("shanghai");        cityRepository.save(city);    }    @Test    public void findAll(){        List<City> list = cityRepository.findAll();        list.forEach(c->{            System.out.println(c.getId()+" "+c.getName()+" "+c.getProvince());        });    }}

别离执行两个办法能够看到日志,实际操作写的时候是在master库,操作读的时候是在slave库

sharding-jdbc读写拆散强制某库执行操作

这种办法次要是针对那些数据量大,数据无奈及时同步到从库,能够间接从主库读取
具体配置

spring.shardingsphere.props.sql.show=truespring.shardingsphere.datasource.names=ds0,ds1spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSourcespring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driverspring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://localhost:3306/test1spring.shardingsphere.datasource.ds0.username=rootspring.shardingsphere.datasource.ds0.password=351848327spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSourcespring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driverspring.shardingsphere.datasource.ds1.jdbc-url=jdbc:mysql://localhost:3306/test2spring.shardingsphere.datasource.ds1.username=rootspring.shardingsphere.datasource.ds1.password=351848327spring.shardingsphere.sharding.tables.city.database-strategy.hint.algorithm-class-name=com.zhao.hint.MyHint

具体Hint的规定

public class MyHint implements HintShardingAlgorithm<Long> {    @Override    public Collection<String> doSharding(Collection<String> targetNames, HintShardingValue<Long> hintShardingValue) {        Collection<String> results = new ArrayList<>();        for (String each :targetNames){            for (Long value:hintShardingValue.getValues()){                    if (each.endsWith(String.valueOf(value%2))){                        results.add(each);                    }            }        }        return results;    }}

Hint测试类

@RunWith(SpringRunner.class)@SpringBootTest(classes = RunBoot.class)public class TestHint {    @Resource    CityRepository cityRepository;    @Test    public void testHint(){        HintManager hintManager =HintManager.getInstance();        hintManager.setDatabaseShardingValue(0L);        List<City> list = cityRepository.findAll();        System.out.println("主库表大小"+list.size());        hintManager.setDatabaseShardingValue(1L);        List<City> list1 = cityRepository.findAll();        System.out.println("从库表大小"+list1.size());    }}

执行后能够看到两次查问别离从主库和从库中获取了数据

sharding-jdbc分库分表

分库分表中要解决的包含id生成,分表列,播送表,字表追随父表进行分表等配置
测试试题类

@Data@Table(name = "position")@Entity@ToStringpublic class Position implements Serializable {   @Id   @Column(name = "Id")   @GeneratedValue(strategy = GenerationType.IDENTITY)   private Long Id;   @Column(name = "name")   private String name;   @Column(name = "salary")   private  String salary;   @Column(name = "city")   private  String city;}@Data@Table(name = "position_detail")@Entitypublic class PositionDetail implements Serializable {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    @Column(name = "id")    private  Long id;    @Column(name = "pid")    private  Long pid;    @Column(name = "description")    private  String description;}@Data@Table(name = "b_order")@Entitypublic class Border implements Serializable {    @Id    @Column(name = "id")    @GeneratedValue(strategy = GenerationType.IDENTITY)    private long id;    @Column(name="is_del")    private Boolean isDel;    @Column(name = "company_id")    private Integer companyId;    @Column(name = "position_id")    private long positionId;    @Column(name = "user_id")    private Integer userId;    @Column(name = "publish_user_id")    private Integer publishUserId;    @Column(name = "resume_type")    private Integer resumeType;    @Column(name = "status")    private String status;    @Column(name = "create_time")    private Date createTime;    @Column(name = "operate_time")    private Date operateTime;    @Column(name = "work_year")    private String workYear;    @Column(name = "name")    private  String name;    @Column(name = "position_name")    private String positionName;    @Column(name = "resume_id")    private Integer resumeId;}
spring.shardingsphere.datasource.names=ds0,ds1spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSourcespring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driverspring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://localhost:3306/test1spring.shardingsphere.datasource.ds0.username=rootspring.shardingsphere.datasource.ds0.password=351848327spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSourcespring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driverspring.shardingsphere.datasource.ds1.jdbc-url=jdbc:mysql://rlocalhost:3306/test2spring.shardingsphere.datasource.ds1.username=rootspring.shardingsphere.datasource.ds1.password=351848327#shardingspring.shardingsphere.sharding.tables.position.database-strategy.inline.sharding-column=idspring.shardingsphere.sharding.tables.position.database-strategy.inline.algorithm-expression=ds$->{id % 2}spring.shardingsphere.sharding.tables.position.key-generator.column=id#spring.shardingsphere.sharding.tables.position.key-generator.type=SNOWFLAKEspring.shardingsphere.sharding.tables.position.key-generator.type=zhao-sharding-keyspring.shardingsphere.sharding.tables.position_detail.database-strategy.inline.sharding-column=pidspring.shardingsphere.sharding.tables.position_detail.database-strategy.inline.algorithm-expression=ds$->{pid % 2}spring.shardingsphere.sharding.tables.position_detail.key-generator.column=id#spring.shardingsphere.sharding.tables.position.key-generator.type=SNOWFLAKEspring.shardingsphere.sharding.tables.position_detail.key-generator.type=zhao-sharding-key#broadcastspring.shardingsphere.sharding.broadcast-tables=cityspring.shardingsphere.sharding.tables.city.key-generator.column=idspring.shardingsphere.sharding.tables.city.key-generator.type=SNOWFLAKE#sharding-database-tablespring.shardingsphere.sharding.tables.b_order.database-strategy.inline.sharding-column=company_idspring.shardingsphere.sharding.tables.b_order.database-strategy.inline.algorithm-expression=ds$->{company_id % 2}spring.shardingsphere.sharding.tables.b_order.table-strategy.inline.sharding-column=idspring.shardingsphere.sharding.tables.b_order.table-strategy.inline.algorithm-expression=b_order$->{id % 2}spring.shardingsphere.sharding.tables.b_order.actual-data-nodes=ds${0..1}.b_order${0..1}spring.shardingsphere.sharding.tables.b_order.key-generator.column=idspring.shardingsphere.sharding.tables.b_order.key-generator.type=SNOWFLAKE

自定义id生成器

@Slf4jpublic class MyShardingId implements ShardingKeyGenerator {    private SnowflakeShardingKeyGenerator shardingKeyGenerator = new SnowflakeShardingKeyGenerator();    @Override    public Comparable<?> generateKey() {        log.info("执行了自定义的id生成器");        return shardingKeyGenerator.generateKey();    }    @Override    public String getType() {        return "zhao-sharding-key";    }    @Override    public Properties getProperties() {        return null;    }    @Override    public void setProperties(Properties properties) {    }}

执行的测试方法

@RunWith(SpringRunner.class)@SpringBootTest(classes = RunBoot.class)public class TestingShardingDatabase {    @Resource    PositionRepository positionRepository;    @Resource    PositionDetailRepository positionDetailRepository;    @Resource    CityRepository cityRepository;    @Resource    BorderRepository borderRepository;    /**     * 测试是否分库     */    @Test    public void testAdd(){        for (long i=1;i<=20;i++){            Position position = new Position();            //position.setId(i);            position.setCity("shanghai");            position.setName("zhao");            position.setSalary("100.86");            positionRepository.save(position);        }    }    /**     * 分库时主表和字表配置的规定一样,所以这里测试的是主表和字表在同库对应     */    @Test    public void testAddDetail(){        for (long i=1;i<=20;i++){            Position position = new Position();            //position.setId(i);            position.setCity("shanghai");            position.setName("zhao");            position.setSalary("100.86");            positionRepository.save(position);            PositionDetail detail = new PositionDetail();            detail.setPid(position.getId());            detail.setDescription("This is message "+i);            positionDetailRepository.save(detail);        }    }    /**     * 测试加载数据分库时走的那个库     */    @Test    public void testLoadData(){        Object object = positionRepository.findPositionLoadById(607972934107004929L);        Object[] objects = (Object[]) object;        System.out.println(objects[0]+" "+objects[1]);    }    /**     * 播送表会写入多个库     */    @Test    public void testBroadCast(){        City city = new City();        city.setName("shanghai");        city.setProvince("shanghai");        cityRepository.save(city);    }    /**     * 测试分表时如何插入     */    @Test    @Repeat(100)    public void testShardingBorder(){        Random random = new Random();        int companyId = random.nextInt(10);        Border border = new Border();        border.setIsDel(false);        border.setCompanyId(companyId);        border.setCreateTime(new Date());        border.setName("zhao");        border.setWorkYear("2");        borderRepository.save(border);    }}

以上操作依赖的pom文件为

 <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-jdbc</artifactId>            <version>2.2.5.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-data-jpa</artifactId>            <version>2.2.5.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <version>2.2.5.RELEASE</version>            <scope>test</scope>        </dependency>        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <version>5.1.48</version>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <version>1.18.20</version>        </dependency>        <dependency>            <groupId>org.apache.shardingsphere</groupId>            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>            <version>4.1.0</version>        </dependency>        <!--<dependency>-->            <!--<groupId>org.apache.shardingsphere</groupId>-->            <!--<artifactId>sharding-transaction-xa-core</artifactId>-->            <!--<version>4.1.0</version>-->        <!--</dependency>-->        <!--<dependency>-->            <!--<groupId>org.apache.shardingsphere</groupId>-->            <!--<artifactId>sharding-transaction-base-saga</artifactId>-->        <!--</dependency>-->    </dependencies>

以上就是sharding-jdbc的一些根底应用的介绍。本文github地址https://github.com/zhendiao/d...

欢送搜寻关注自己与敌人共同开发的微信面经小程序【大厂面试助手】和公众号【微瞰技术】