一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 使用sharding-jdbc實現水平分表的示例代碼

使用sharding-jdbc實現水平分表的示例代碼

2022-03-09 13:25穿條秋褲到處跑 Java教程

本文主要介紹了sharding-jdbc實現水平分表,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

在mysql中新建數據庫sharding_db,新增兩張結構一樣的表student_1和student_2。

CREATE TABLE `student_1` (
`ID`  bigint(20) NOT NULL ,
`NAME`  varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL ,
`AGE`  int(11) NOT NULL ,
`GENDER`  varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL ,
PRIMARY KEY (`ID`)
);

此處未指定主鍵自增,因為兩張表的id不能重復,所以只能從后端傳入id。

 

添加依賴

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Druid連接池 -->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.1.20</version>
</dependency>

<!-- Mysql驅動依賴 -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
</dependency>

<!-- MybatisPlus -->
<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-boot-starter</artifactId>
  <version>3.0.5</version>
</dependency>

<!-- Sharding-JDBC -->
<dependency>
  <groupId>org.apache.shardingsphere</groupId>
  <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
  <version>4.0.0-RC1</version>
</dependency>

<!-- lombok -->
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-test</artifactId>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
  <exclusions>
      <exclusion>
          <groupId>org.junit.vintage</groupId>
          <artifactId>junit-vintage-engine</artifactId>
      </exclusion>
  </exclusions>
</dependency>

 

編寫配置文件

spring.main.allow-bean-definition-overriding=true

# 配置Sharding-JDBC的分片策略
# 配置數據源,給數據源起名g1,g2...此處可配置多數據源
spring.shardingsphere.datasource.names=g1

# 配置數據源具體內容:連接池,驅動,地址,用戶名,密碼
# 由于上面配置數據源只有g1因此下面只配置g1.type,g1.driver-class-name,g1.url,g1.username,g1.password
spring.shardingsphere.datasource.g1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.g1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.g1.url=jdbc:mysql://localhost:3306/sharding_db?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.g1.username=root
spring.shardingsphere.datasource.g1.password=123456

# 配置表的分布,表的策略
spring.shardingsphere.sharding.tables.student.actual-data-nodes=g1.student_$->{1..2}

# 指定student表 主鍵gid 生成策略為 SNOWFLAKE
spring.shardingsphere.sharding.tables.student.key-generator.column=id
spring.shardingsphere.sharding.tables.student.key-generator.type=SNOWFLAKE

# 指定分片策略 約定id值是偶數添加到student_1表,如果id是奇數添加到student_2表
spring.shardingsphere.sharding.tables.student.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.student.table-strategy.inline.algorithm-expression=student_$->{id % 2 + 1}

# 打開sql輸出日志
spring.shardingsphere.props.sql.show=true

或者是yml格式

spring:
main:
  allow-bean-definition-overriding: true
shardingsphere:
  datasource:
    g1:
      driver-class-name: com.mysql.cj.jdbc.Driver
      password: 123456
      type: com.alibaba.druid.pool.DruidDataSource
      url: jdbc:mysql://localhost:3306/sharding_db?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
      username: root
    names: g1
  props:
    sql:
      show: true
  sharding:
    tables:
      student:
        actual-data-nodes: g1.student_$->{1..2}
        key-generator:
          column: id
          type: SNOWFLAKE
        table-strategy:
          inline:
            algorithm-expression: student_$->{id % 2 + 1}
            sharding-column: id

 

編寫實體類

@Data
public class Student {
  private Long id;
  private String name;
  private int age;
  private String gender;
}

 

編寫mapper接口

@Repository
public interface StudentMapper extends BaseMapper<Student> {

}

 

編寫測試類

@SpringBootTest
class ShardingJdbcDemoApplicationTests {

  @Autowired
  private StudentMapper studentMapper;

  @Test
  public void test01() {
      for (int i = 0; i < 10; i++) {
          Student student = new Student();
          student.setName("wuwl");
          student.setAge(27);
          student.setGender("男");
          studentMapper.insert(student);
      }
  }
}

 

執行測試

使用sharding-jdbc實現水平分表的示例代碼

執行成功,主鍵通過雪花算法在后端生成,傳入到數據庫中,根據奇偶性進行分表。

student_1表數據:

使用sharding-jdbc實現水平分表的示例代碼

student_2表數據:

使用sharding-jdbc實現水平分表的示例代碼

兩張表的數據分別有5條,但這只是因為雪花算法生成的id奇數偶數各5個,不是1:1的關系,需要注意。
主鍵生成后,根據策略插入到對應的表中,從打印出來的sql可以證明這一點。
通過mapper接口的selectById方法進行查詢時,會先根據主鍵策略判斷在哪個庫,再直接去那個庫根據主鍵查詢。而如果是通過其它條件查詢,或者是多個id的selectById方法查詢,又是如何的呢?

  @Test
  public void test03() {
      List<Long> list = new ArrayList<>();
      list.add(1362282042768609282l);
      list.add(1362282040277192705l);
      List<Student> studentList = studentMapper.selectBatchIds(list);
      System.out.println(studentList);
  }

取了兩張表的id進行查詢。

使用sharding-jdbc實現水平分表的示例代碼

執行同樣的sql,在兩張表中都查詢一遍,再組合結果。
如果所有的id,都來自同一張表,那是否會去多個表中重復查詢呢?

使用sharding-jdbc實現水平分表的示例代碼

只執行了一遍。所以,在執行查詢時,sharding會先判斷是否可以確定需要的數據來自那張表,如果能,則直接去那一張表中查詢數據即可,而如果不能確定,則會多個表重復查詢,以確定查詢結果的完整性。

到此這篇關于使用sharding-jdbc實現水平分表的示例代碼的文章就介紹到這了,更多相關sharding-jdbc 水平分表內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/qq_41885819/article/details/113845364

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲乱亚洲乱妇41p国产成人 | 农村妇女野外性生话免费视频 | 强制高h | 国产精品久久国产精品99盘 | 清纯漂亮女友初尝性过程 | 久久精品手机观看 | 四虎新网址 | 国产成人yy精品1024在线 | 极品丝袜老师h系列全文阅读 | 亚洲欧洲日产国码无码av | 国产短视频精品一区二区三区 | 大桥未久midd—962在线 | 日本红色高清免费观看 | 国产午夜大片 | 毛片在线免费视频 | 色老板最新网站视频地址 | 久久精麻豆亚洲AV国产品 | 男人猛激烈吃奶gif动态图 | 亚洲激情在线视频 | 美女模特被c免费视频 | 色花堂国产精品首页第一页 | 久久精品国产清白在天天线 | 国产亚洲精品91 | 日本丰满www色 | 成人网视频免费播放 | 激情另类国内一区二区视频 | 欧美国产合集在线视频 | 亚洲国产日韩制服在线观看 | 91精品国产综合久久福利 | 国产精品嫩草影院一二三区入口 | 日日本老女人 | 国产精品视频第一区二区 | 奇米影视中文字幕 | 成人免费观看网欧美片 | 精品福利一区 | 男女精品视频 | 久青草国产在视频在线观看 | 沉香如屑西瓜视频免费观看完整版 | 国内偷拍第一页 | 亚洲欧美日韩综合一区久久 | 国产精品免费网站 |