Sharding-JDBC简介

ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。
他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。
ShardingSphere定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。
它与NoSQL和NewSQL是并存而非互斥的关系。NoSQL和NewSQL作为新技术探索的前沿,放眼未来,拥抱变化,是非常值得推荐的。反之,也可以用另一种思路看待问题,放眼未来,关注不变的东西,进而抓住事物本质。
关系型数据库当今依然占有巨大市场,是各个公司核心业务的基石,未来也难于撼动,我们目前阶段更加关注在原有基础上的增量,而非颠覆

sharding-jdbc 定位为轻量级Java框架,在Java的JDBC层提供的额外服务。
它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。
适用于任何基于Java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC
Template或直接使用JDBC。 基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid,
HikariCP等。 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer和PostgreSQL

项目实战

本项目采用SpringBoot2.1.3+MyBatisPlus+ShardingJDBC实现数据库分库分表

导入主要依赖

<dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.1.0</version>
    </dependency>
    <dependency>
        <groupId>io.shardingsphere</groupId>
        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        <version>3.1.0</version>
    </dependency>
    <dependency>
    <groupId>io.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-namespace</artifactId>
    <version>3.1.0</version>
    </dependency>

配置sharding-jdbc

# 数据源 ts0,ts1,ts2,ts3
sharding.jdbc.datasource.names=ts0,ts1,ts2,ts3
# 第一个数据库
sharding.jdbc.datasource.ts0.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.ts0.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.ts0.jdbc-url=jdbc:mysql://192.168.0.103:3306/ts1?characterEncoding=utf-8&&serverTimezone=GMT%2B8
sharding.jdbc.datasource.ts0.username=root
sharding.jdbc.datasource.ts0.password=123456
# 第二个数据库
sharding.jdbc.datasource.ts1.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.ts1.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.ts1.jdbc-url=jdbc:mysql://192.168.0.103:3306/ts2?characterEncoding=utf-8&&serverTimezone=GMT%2B8
sharding.jdbc.datasource.ts1.username=root
sharding.jdbc.datasource.ts1.password=123456
# 第三个数据库
sharding.jdbc.datasource.ts2.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.ts2.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.ts2.jdbc-url=jdbc:mysql://192.168.0.103:3306/ts3?characterEncoding=utf-8&&serverTimezone=GMT%2B8
sharding.jdbc.datasource.ts2.username=root
sharding.jdbc.datasource.ts2.password=123456
# 第四个数据库
sharding.jdbc.datasource.ts3.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.ts3.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.ts3.jdbc-url=jdbc:mysql://192.168.0.103:3306/ts4?characterEncoding=utf-8&&serverTimezone=GMT%2B8
sharding.jdbc.datasource.ts3.username=root
sharding.jdbc.datasource.ts3.password=123456

# 水平拆分的数据库(表) 配置分库 + 分表策略 行表达式分片策略
# 分库策略
sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=id
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=ts$->{id % 2}
# 分表策略 其中user为逻辑表 分表主要取决于id行
sharding.jdbc.config.sharding.tables.user.actual-data-nodes=ts$->{0..3}.user
sharding.jdbc.config.sharding.tables.user.table-strategy.inline.sharding-column=id
# 分片算法表达式
sharding.jdbc.config.sharding.tables.user.table-strategy.inline.algorithm-expression=user
# 主键 UUID 18位数 如果是分布式还要进行一个设置 防止主键重复
#sharding.jdbc.config.sharding.tables.user.key-generator-column-name=id
# 打印执行的数据库以及语句
sharding.jdbc.config.props..sql.show=true
spring.main.allow-bean-definition-overriding=true

actual-data-nodes:真实数据节点,由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持inline表达式。
table-strategy.inline.sharding-column:分片字段配置
table-strategy.inline.algorithm-expression:分片算法表达式

基础代码

启动类添加注解@MapperScan
userEntity

@Data
@EqualsAndHashCode(callSuper = true)
@TableName("user")
public class User extends Model<User> {
    private Integer id;
    private String username;
    private String password;
    private String phone;
    private String email;
//    private Date created;
//    private Date updated;
}

userMapper

public interface UserMapper extends BaseMapper<User> {

}

userService

public interface UserService extends IService<User> {

    boolean save(User user);

    List<User> getList();
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {



    @Override
    public boolean save(User user) {
        return super.save(user);
    }

    @Override
    public List<User> getList() {
        return baseMapper.selectList(Wrappers.lambdaQuery());
    }
}

UserController

@RestController
public class UserController {

    @Autowired
    public UserService userService;

    @GetMapping("/list")
    public List<User> getList(){
        return userService.getList();
    }


    @GetMapping("/insert")
    public Boolean insert(User user){
        boolean save=false;
        try{
            save = userService.save(user);
        }catch(Exception ex){
            System.out.println(ex.getMessage());
        }
        return save;

    }
}

测试

http://localhost:8081/insert?id=10&username=lhd&password=12&phone=111&email=111 http://localhost:8081/insert?id=11&username=lhd&password=12&phone=112&email=112
http://localhost:8081/insert?id=12&username=lhd&password=12&phone=113&email=113
http://localhost:8081/insert?id=13&username=lhd&password=12&phone=114&email=114