Sharding JDBC如何分庫分表?看完你就會了


Sharding JDBC的操作分為配置使用、讀寫分離、分庫分表以及應用等,今天我們主要來了解一下關於分庫分表的操作,如果你對此感興趣的話,那我們就開始吧。

 

環境准備

 

pom.xml

 

<parent>

 

    <groupId>org.springframework.boot</groupId>

 

    <artifactId>spring-boot-starter-parent</artifactId>

 

    <version>2.1.3.RELEASE</version></parent>

 

<properties>

 

    <java.version>1.8</java.version>

 

    <sharding.version>3.1.0</sharding.version></properties>

 

<dependencies>

 

    <dependency>

 

        <groupId>io.shardingsphere</groupId>

 

        <artifactId>sharding-jdbc-core</artifactId>

 

        <version>${sharding.version}</version>

 

    </dependency>

 

 

 

    <dependency>

 

        <groupId>io.shardingsphere</groupId>

 

        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>

 

        <version>${sharding.version}</version>

 

    </dependency>

 

 

 

    <dependency>

 

        <groupId>com.alibaba</groupId>

 

        <artifactId>druid</artifactId>

 

        <version>1.1.10</version>

 

    </dependency>

 

 

 

    <dependency>

 

        <groupId>org.mybatis</groupId>

 

        <artifactId>mybatis</artifactId>

 

        <version>3.4.5</version>

 

    </dependency>

 

 

 

    <dependency>

 

        <groupId>org.mybatis.spring.boot</groupId>

 

        <artifactId>mybatis-spring-boot-starter</artifactId>

 

        <version>1.3.1</version>

 

    </dependency>

 

 

 

    <dependency>

 

        <groupId>mysql</groupId>

 

        <artifactId>mysql-connector-java</artifactId>

 

        <version>5.1.46</version>

 

    </dependency>

 

 

 

    <dependency>

 

        <groupId>org.springframework.boot</groupId>

 

        <artifactId>spring-boot-starter</artifactId>

 

    </dependency>

 

 

 

    <dependency>

 

        <groupId>org.projectlombok</groupId>

 

        <artifactId>lombok</artifactId>

 

    </dependency>

 

 

 

    <dependency>

 

        <groupId>org.springframework.boot</groupId>

 

        <artifactId>spring-boot-starter-test</artifactId>

 

        <scope>test</scope>

 

    </dependency></dependencies>

 

<build>

 

    <plugins>

 

        <plugin>

 

            <groupId>org.springframework.boot</groupId>

 

            <artifactId>spring-boot-maven-plugin</artifactId>

 

        </plugin>

 

    </plugins></build>

 

domain

 

// 建立domain@Setter@Getter@ToString@NoArgsConstructor@AllArgsConstructorpublic class Employee {

 

    private Long id;

 

    private String name;}

 

配置類

 

@SpringBootApplication@MapperScan("cn.wolfcode.sharding.mapper")public class ShardingApplication { }

 

分庫分表

 

案例模型

 

把數據分別存放在兩台服務器的兩個數據庫中表,通過分片算法來決定當前的數據存放在哪個數據庫的哪個表中,由於一個連接池只能連接一個特定的數據庫,所以這里需要創建多個連接池對象

 

建表

 

-- 分別在2台服務器中建立數據庫sharding,並且建表employee_0和employee_1CREATE TABLE `employee_0` (

 

  `id` bigint(20) PRIMARY KEY AUTO_INCREMENT,

 

  `name` varchar(255) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ###################################CREATE TABLE `employee_1` (

 

  `id` bigint(20) PRIMARY KEY AUTO_INCREMENT,

 

  `name` varchar(255) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

application.properties

 

# 定義連接池

 

sharding.jdbc.datasource.names=db0,db1

 

 

 

# 格式sharding.jdbc.datasource.連接池名.xxx:設置4要素信息

 

sharding.jdbc.datasource.db0.type=com.alibaba.druid.pool.DruidDataSource

 

sharding.jdbc.datasource.db0.driver-class-name=com.mysql.jdbc.Driver

 

sharding.jdbc.datasource.db0.url=jdbc:mysql://db0Ip:port/sharing

 

sharding.jdbc.datasource.db0.username=xxx

 

sharding.jdbc.datasource.db0.password=xxx

 

 

 

sharding.jdbc.datasource.db1.type=com.alibaba.druid.pool.DruidDataSource

 

sharding.jdbc.datasource.db1.driver-class-name=com.mysql.jdbc.Driver

 

sharding.jdbc.datasource.db1.url=jdbc:mysql://db1Ip:port/sharing

 

sharding.jdbc.datasource.db1.username=xxx

 

sharding.jdbc.datasource.db1.password=xxx

 

 

 

# 設置分庫規則

 

# sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column:分庫列

 

# sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression:分庫算法

 

sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=id

 

sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=db$->{id % 2}

 

 

 

# 綁定邏輯表

 

sharding.jdbc.config.sharding.binding-tables=employee

 

 

 

# 設置分表規則

 

# sharding.jdbc.config.sharding.tables.邏輯表.actual-data-nodes:邏輯表對應的真實表

 

# sharding.jdbc.config.sharding.tables.邏輯表.table-strategy.inline.sharding-column:分表列

 

# sharding.jdbc.config.sharding.tables.邏輯表.table-strategy.inline.algorithm-expression:分表算法

 

# sharding.jdbc.config.sharding.tables.邏輯表.key-generator-column-name:主鍵列

 

sharding.jdbc.config.sharding.tables.employee.actual-data-nodes=db$->{0..1}.employee_$->{0..1}

 

sharding.jdbc.config.sharding.tables.employee.table-strategy.inline.sharding-column=id

 

sharding.jdbc.config.sharding.tables.employee.table-strategy.inline.algorithm-expression=employee_$->{id % 2}

 

sharding.jdbc.config.sharding.tables.employee.key-generator-column-name=id

 

 

 

# 打印日志

 

sharding.jdbc.config.props.sql.show=true

 

mapper

 

/**

 

 * 這里寫的employee表是上面所配置的邏輯表

 

 * 底層會根據分片規則,把我們寫的邏輯表改寫為數據庫中的真實表

 

 */@Mapperpublic interface EmployeeMapper {

 

    @Select("select * from employee")

 

    List<Employee> selectAll();

 

 

 

    @Insert("insert into employee (name) values (#{name})")

 

    void inser(Employee entity);}

 

測試

 

@RunWith(SpringRunner.class)@SpringBootTest(classes=ShardingApplication.class)public class ShardingApplicationTests {

 

 

 

    @Autowired

 

    private EmployeeMapper employeeMapper;

 

 

 

    @Test

 

    public void save() {

 

        for (int i = 0; i < 10; i++) {

 

            Employee employee = new Employee();

 

            employee.setName("xx"+i);

 

            employeeMapper.inser(employee);

 

        }

 

    }

 

 

 

    @Test

 

    public void list() {

 

        employeeMapper.selectAll().forEach(System.out::println);

 

    }}

 

優缺點

 

  • 拆分后單表數據量比較小,單表大數據被拆分,解決了單表大數據訪問問題
  • 分表以什么切分如果弄的不好,導致多次查詢,而且有時候要跨庫操作,甚至導致join無法使用,對排序分組等有性能影響
  • 之前的原子操作被拆分成多個操作,事務處理變得復雜
  • 多個DB維護成本增加

 

 

 

 

看完這些操作后不妨自己去試試,實踐才能檢驗真知,如果遇到了問題,也可以及時向我詢問,我也會盡我所力幫助你。


免責聲明!

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



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