Sharding-JDBC之分库分表

一、Sharding-JDBC简介

Sharding-JDBC是ShardingSphere的第一个产品,也是ShardingSphere的前身。 它定位为轻量级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标准的数据库。

使用Sharding-JDBC可以实现数据分片、读写分离、分布式事务等需求。

本篇文章主要介绍通过Sharding-JDBC实现数据分片,即分库分表。

Sharding-JDBC提供了4种配置方式,用于不同的使用场景。本文只介绍Spring命名空间配置和SpringBoot配置。

二、准备工作

在虚拟机上部署两台Mysql服务器,IP地址分别为192.168.0.150,192.168.0.152。

然后创建数据库,数据库名分别为sharding_order,shard_order以示区分。

Sharding-JDBC之分库分表_第1张图片

在sharding_order,shard_order中均创建两张结构一致的表,表名分别为t_order_1,t_order_2。建表语句如下:

CREATE TABLE `t_order_1` (
  `id` int NOT NULL,
  `order_amount` decimal(10,2) NOT NULL,
  `order_status` int NOT NULL,
  `user_id` int NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

Sharding-JDBC之分库分表_第2张图片

三、创建项目

在IDEA中新建SpringBoot项目,选择以下依赖
Sharding-JDBC之分库分表_第3张图片

然后通过MyBatis Generator创建实体类和Dao层接口及Mapper文件。配置如下:





    
    

    
    

    
        
        
            
            
            
        

        
        
        
        
        
            
        


        
        
            
            
        

        
        
            
        

        
        
            
        

        
        

项目创建完成后的结构如下:
Sharding-JDBC之分库分表_第4张图片

四、Spring命名空间配置

在pom文件中引入Sharding-JDBC命名空间配置的依赖


    org.apache.shardingsphere
    sharding-jdbc-spring-namespace
    4.1.1

在resources目录下新建配置文件sharding-jdbc.xml,内容如下:



    
    
    
    
        
        
        
        
    
    
        
        
        
        
    
    
    
    
        
        
            
            
                
                
                
            
        
    

    
    
    
    

    
    
        
        
    

在启动类上添加@ImportResource@MapperScan注释

Sharding-JDBC之分库分表_第5张图片

在测试类中创建测试方法

@SpringBootTest
class ShardingDemoApplicationTests {
    @Resource
    OrderMapper orderMapper;

    @Test
    void contextLoads() {
    }

    @Test
    public void testOrder(){
        Order order=new Order();
        order.setId(21);
        order.setOrderAmount(BigDecimal.TEN);
        order.setOrderStatus(0);
        order.setUserId(1);
        orderMapper.insert(order);
    }

}

这里id设置为21,user_id设置为1,根据前面配置的分库规则使用user_id取模结果为1,所以该记录会落在数据源ds1中,即152服务器上的数据库。根据分表的规则id取模再加1,结果为2,所以该记录最终落在152数据库shard_order数据库中的t_order_2表中。

Sharding-JDBC之分库分表_第6张图片

再将id设置为22,user_id设置为2,该记录最终应落在150数据库sharding-order的t_order_1中。

Sharding-JDBC之分库分表_第7张图片

五、SpringBoot配置

将Spring命名空间配置的依赖删除或注释,引入SpringBoot配置的依赖


     org.apache.shardingsphere
     sharding-jdbc-spring-boot-starter
     4.1.1
-->

在application.properties中添加以下配置

spring.shardingsphere.datasource.names=ds0,ds1

spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds0.jdbcUrl=jdbc:mysql://192.168.0.150:3306/sharding_order
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=

spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds1.jdbcUrl=jdbc:mysql://192.168.0.152:3306/shard_order
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=

spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=ds$->{0..1}.t_order_$->{1..2}
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order_$->{id % 2 + 1}
spring.shardingsphere.sharding.tables.t_order.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.t_order.database-strategy.inline.algorithm-expression=ds$->{user_id % 2}

mybatis.mapper-locations=/mapper/*.xml

将启动类上的@ImportResource删除或者注释

测试方法同Spring命名空间配置的方式。

你可能感兴趣的:(sharding-jdbc)