sharding-jdbc分库分表实践


sharding-jdbc分库分表实践

在项目中大量的使用到sharding-jdbc,今天将它的实践用法做一个总结。
总结前先提几个问题:

  1. 为什么要用sharding-jdbc?
  2. 如何使用?
  3. 有什么注意事项?
  4. 同类型的框架对比?
    让我们带着问题去开始了解sharding-jdbc。

基础知识

sharding-jdbc是定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

  • roadmap

shardingsphere

  • Sharding-Proxy

Sharding-Proxy

  • 支持的功能

YVJ5PH.png

快速入门

maven依赖

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-core</artifactId>
    <version>${latest.release.version}</version>
</dependency>

规则配置

Sharding-JDBC可以通过Java,YAML,Spring命名空间和Spring Boot Starter四种方式配置,开发者可根据场景选择适合的配置方式。详情请参见配置手册。

创建DataSource

通过ShardingDataSourceFactory工厂和规则配置对象获取ShardingDataSource,ShardingDataSource实现自JDBC的标准接口DataSource。然后即可通过DataSource选择使用原生JDBC开发,或者使用JPA, MyBatis等ORM工具。

演示实例

  • 用springBoot Starter+mysql方式演示
  1. pom文件
<properties>
    <sharding.jdbc.version>4.0.1</sharding.jdbc.version>
</properties>

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>${sharding.jdbc.version}</version>
</dependency>
<!-- for spring namespace -->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-namespace</artifactId>
    <version>${sharding.jdbc.version}</version>
</dependency>
  1. 分库分表配置规则(基于yml文件)
spring:
  shardingsphere:
    datasource:
      names: ds0,ds1
      # 数据源ds0
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/ds0?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT
        username: root
        password: 111111
      # 数据源ds1
      ds1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/ds1?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT
        username: root
        password: 111111
    sharding:
      default-database-strategy: # 分库规则
        inline:
          sharding-column: vender_id
          algorithm-expression: ds${vender_id % 2}
      tables:
        t_user:  #t_user表
          key-generator-column-name: id  #主键
          actual-data-nodes: ds${0..1}.t_user    #真实数据节点
          database-strategy: # 分库策略
            inline:
              sharding-column: vender_id # 分库键
              algorithm-expression: ds${vender_id % 2}
#          tableStrategy: #分表策略
#            inline: #行表达式
#              shardingColumn: vender_id
#              algorithmExpression: t_user${vender_id % 2}
  1. 创建DataSource

由于引入使用了SpringBoot Mybatis因此会自动装配相应的DataSource

<!-- SpringBoot Mybatis 依赖 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.0</version>
</dependency>

如果在不同的库中有相同的表,但是未设置分库策略的话会随机使用一个连接进行查询(这一点可以在下一章中分析原因)

注意事项

sharding-jdbc官网上的示例地址已经不是跳转的那个单独的演示项目地址了,已经被合并到主项目中。直接下载主项目时候如果是window会提示文件名称太长,官网已经给了解决方案

git config --global core.longpaths true

总结

以上只是粗略的将sharding-jdbc介绍了一下,下一篇文章我们来分析一下sharding-jdbc的原理。

  • 参考资料

方案虽好,成本先行:数据库Sharding+Proxy实践解析


  TOC