Sharding-JDBC基本使用,整合Springboot实现分库分表,读写分离

结合上一篇docker部署的mysql主从, 本篇主要讲解SpringBoot项目结合Sharding-JDBC如何实现jjd.html">分库分表、读写分离。 一、Sharding-JDBC介绍

1、这里引用官网上的介绍:

  定位为轻量级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标准的数据库。

2、自己的理解:
  增强版的JDBC驱动,客户端使用的时候,就像正常使用JDBC驱动一样, 引入Sharding-JDBC依赖包,连接好数据库,配置好分库分表规则,读写分离配置,然后客户端的sql 操作 Sharding-JDBC会自动根据配置完成 分库分表和读写分离操作。

二、实现效果

1、下图展示了我们通过Sharding-JDBC实现的分库分表及读写分离效果图

  分库分表:结合上一篇的主从,这里我们使用上次搭建的主从数据库,3307的app1是主数据库,3308的app1是对应的从数据库。同时,我们在3307新建app2库和user2表,这里的app2库需要和app1库一样,user2表和user1表结构一样,主从会自动帮我们建表同步到3308,然后我们在项目中使用Sharding-JDBC 配置响应的分库分表策略,使得插入数据的时候 根据配置字段的分片规则将数据打入对应的库和表。在我们这里主要是 根据分库的分片规则决定数据进入3307的app1库还是app2库,然后再根据分表的分片规则决定进入user1表还是user2表。
  读写分离:读写分离 在我们这里主要指的是 我们项目DQL会根据Sharding-JDBC配置的master-slave-rule走的3308的数据源,而项目的DML会根据master-slave-rule走3307的数据源

分库分表读写分离

三、Spring-Boot项目整合Sharding-JDBC实现分库分表、读写分离

1、这里创建一个maven项目,首先引入依赖,pom.xml文件如下。

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 "> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.3.RELEASE</version> </parent> <groupId>com.cgg</groupId> <artifactId>sharding-jdbc-test</artifactId> <version>1.0-SNAPSHOT</version> <properties> <java.version>1.8</java.version> </properties> <dependencies> <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>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.21</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.1</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-extension</artifactId> <version>3.1.1</version> </dependency> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.0-RC1</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

注意:这里使用的是4.0的sharding-jdbc,spring-boot的版本是2.x的,在整合过程中遇见了许多问题,后面会有错误的解决步骤。
2、application.yml文件如下

spring: jpa: properties: hibernate: hbm2ddl: auto: create dialect: org.hibernate.dialect.MySQL5Dialect show_sql: true shardingsphere: props: sql: show: true datasource: names: master0,master0slave0,master1,master1slave0 master0: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3307/app1?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT username: root password: 654321 master1: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3307/app2?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT username: root password: 654321 master0slave0: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3308/app1?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT username: root password: 654321 master1slave0: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3308/app2?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT username: root password: 654321 sharding: default-database-strategy: inline: sharding-column: id algorithm-expression: app$->{(id % 2)+1} tables: user: actual-data-nodes: app$->{1..2}.user$->{1..2} table-strategy: inline: sharding-column: id algorithm-expression: user$->{((""+id)[2..10].toInteger() % 2)+1} key-generator: column: id type: SNOWFLAKE master-slave-rules: app1: master-data-source-name: master0 slave-data-source-names: master0slave0 app2: master-data-source-name: master1 slave-data-source-names: master1slave0 sharding: jdbc: config: masterslave: load-balance-algorithm-type: random

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwdyzf.html