Spring Boot 2.0 整合Sharding-jdbc實現水平分表、水平分庫


1、概述

     ShardingSphere是一套開源的分布式數據庫中間件解決方案組成的生態圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(計划中)這3款相互獨立的產品組成。

他們均提供標准化的數據分片、分布式事務和數據庫治理功能,可適用於如Java同構、異構語言、容器、雲原生等各種多樣化的應用場景。定位為關系型數據庫中間件,旨在充分合理地在分布式的場景下利用關系型數據庫的計算和存儲能力,而並非實現一個全新的關系型數據庫。 它與NoSQL和NewSQL是並存而非互斥的關系。

官網地址:https://shardingsphere.apache.org/

1.1 重點介紹:

Sharding-JDBC定位為輕量級Java框架,在Java的JDBC層提供的額外服務。 它使用客戶端直連數據庫,以jar包形式提供服務,無需額外部署和依賴,可理解為增強版的JDBC驅動,完全兼容JDBC和各種ORM框架。

  • 適用於任何基於JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
  • 支持任何第三方的數據庫連接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
  • 支持任意實現JDBC規范的數據庫。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92標准的數據庫。

支持項:

  • 數據分片
  • 讀寫分離
  • 強制路由
  • 編排治理
  • 分布式事務

不支持項:

DataSource接口

  • 不支持timeout相關操作

Connection接口

  • 不支持存儲過程,函數,游標的操作
  • 不支持執行native的SQL
  • 不支持savepoint相關操作
  • 不支持Schema/Catalog的操作
  • 不支持自定義類型映射

Statement和PreparedStatement接口

  • 不支持返回多結果集的語句(即存儲過程,非SELECT多條數據)
  • 不支持國際化字符的操作

對於ResultSet接口

  • 不支持對於結果集指針位置判斷
  • 不支持通過非next方法改變結果指針位置
  • 不支持修改結果集內容
  • 不支持獲取國際化字符
  • 不支持獲取Array

架構模型:

另外中文文檔下載地址:https://shardingsphere.apache.org/pdf/shardingsphere_docs_cn.pdf

2、水平分表是在同一個數據內,把同一個表的數據按一定規則拆到多個表中。

     水平分庫是在同一個數據,根據規則,保存到不同的庫中,實現分庫。

3、開發工具 idea 、mysql 8      架構:spring boot、mybatis plus、mysql、 lombok、druid

4、首先初始化一個springboot項目,然后修改pom文件

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        <version>4.0.0-RC1</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.23</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.3.2</version>
    </dependency>

 



5、啟動類加入mapper掃描

6、編寫pojo

/**
 * @Author: dkx
 * @Date: 9:58 2020/8/19
 * @Desc:
 */
@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
}


編寫mapper
1 /**
2  * @Author: dkx
3  * @Date: 9:57 2020/8/19
4  * @Desc:
5  */@Repository
6 public interface UserMapper extends BaseMapper<User> {
7 
8 }

 



7、編寫分表規則(可參考官網)
# 配置真實數據源
spring.shardingsphere.datasource.names=ds0,ds1
spring.main.allow-bean-definition-overriding=true
#打開sql控制台輸出日志
spring.shardingsphere.props.sql.show=true
# 配置第 1 個數據源
spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds0.url=jdbc:mysql://127.0.0.1:3306/ds0?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT&allowPublicKeyRetrieval=true
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=root
# 配置第 2 個數據源
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://127.0.0.1:3306/ds1?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT&allowPublicKeyRetrieval=true
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=root
# 配置 user 表規則
spring.shardingsphere.rules.sharding.tables.user.actual-data-nodes=ds$->{0..1}.user_$->{0..1}
#如果先執行分表可打開下面注釋,把上面的注釋關閉
#spring.shardingsphere.rules.sharding.tables.user.actual-data-nodes=ds0.user_$->{0..1}
#主鍵策略 雪花算法
spring.shardingsphere.sharding.tables.user.key-generator.column=id
spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE
# 配置分表策略 主鍵取模 0在0表  1在1表
spring.shardingsphere.sharding.tables.user.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.user.table-strategy.inline.algorithm-expression=user_$->{id % 2}
# 配置分庫策略 年紀取模0在0庫 1在1庫
spring.shardingsphere.sharding.tables.user.database-strategy.inline.sharding-column=age
spring.shardingsphere.sharding.tables.user.database-strategy.inline.algorithm-expression=ds$->{age % 2}

 


8,提前在mysql中創建好對應的庫和表語句,參考pojo類,此處省略。。。。自行百度

 

 

9、編寫test類
class DemoApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    void contextLoads() {
        User user =  new User();
        user.setName("dkx_k");
        user.setAge(3);
        userMapper.insert(user);
    }
}

 



10.控制台輸出日志

 

 

11.查看數據庫

 

 

10.如有不懂的可聯系或留言,看到后第一時間回復。

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM