使用sharding-jdbc实现水平分库+水平分表的示例代码

yizhihongxing

使用 Sharding-JDBC 实现水平分库+水平分表的步骤如下:

1. 创建共享库(shared database)的配置文件

定义数据库名称以及访问方式,如 JDBC URL,数据源等,同时还需要指定共享库所要分片策略和插件配置。

示例代码如下:

# shardingsphere datasource config
spring:
  sharding:
    datasource:
      # 共享库配置
      names: ds_shared  
      ds_shared:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/shared?useSSL=false
        username: root
        password: root

    # 共享库分片
    sharding:
      tables: 
        shared_order:
          # 分片算法
          actual-data-nodes:
            ds_shared.shared_order_$->{1..2}
          # 表分片键
          table-strategy:
            inline:
              sharding-key: order_id
              algorithm-expression: shared_order_$->{order_id % 2 + 1}

          # 数据分片键
          database-strategy: 
            inline:
              sharding-key: user_id
              algorithm-expression: ds$->{user_id % 2 + 1}

      # 标准规则
      default-database-strategy:
        inline:
          sharding-column: user_id
          algorithm-expression: ds$->{user_id % 2 + 1}
      default-table-strategy:
        inline:
          sharding-column: order_id
          algorithm-expression: shared_order_$->{order_id % 2 + 1}

2. 创建分片库的配置文件

类似共享库的配置方式,只是需要指定分片库的配置信息,包括数据源,分片键等。

示例代码如下:

# shardingsphere datasource config
spring:
  sharding:
    datasource:
      # 分片库1配置
      names: ds1
      ds1:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/ds_0?useSSL=false
        username: root
        password: root

      # 分片库2配置
      ds2:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/ds_1?useSSL=false
        username: root
        password: root

    # 分片库分片
    sharding:
      tables: 
        order_item:
          # 分片算法
          actual-data-nodes:
            ds$->{1..2}.order_item_$->{1..2}
          # 表分片键
          table-strategy:
            inline:
              sharding-key: order_id
              algorithm-expression: order_item_$->{order_id % 2 + 1}
          # 数据分片键 
          database-strategy: 
            inline:
              sharding-key: user_id
              algorithm-expression: ds$->{user_id % 2 + 1}

      # 标准规则
      default-database-strategy:
        inline:
          sharding-column: user_id
          algorithm-expression: ds$->{user_id % 2 + 1}
      default-table-strategy:
        none: ''

3. 创建实体类

定义数据库表与对象属性的映射关系,如表名、字段名、数据类型等。

示例代码如下:

@Data
public class OrderItem {
    private Long id;
    private Long orderId;
    private Integer userId;
    private String status;   
}

4. 创建Mapper映射器

创建数据操作的接口,并通过 @Mapper 注解标记为一个 Mapper,同时需要定义SQL语句以及参数的映射关系。

示例代码如下:

@Mapper
public interface OrderItemMapper {

    @Insert("INSERT INTO order_item (order_id, user_id, status)" +
            "VALUES (#{orderId}, #{userId}, #{status})")
    void insert(OrderItem orderItem);

    @Select("SELECT * FROM order_item WHERE order_id = #{orderId}")
    List<OrderItem> selectByOrderId(@Param("orderId") Long orderId);
}

5. 创建服务类

定义应用程序中的服务功能,并注入 Mapper 对象用于操作数据。

示例代码如下:

@Service
public class OrderItemService {

    @Autowired
    private OrderItemMapper orderItemMapper;

    public void insert(OrderItem orderItem) {
        orderItemMapper.insert(orderItem);
    }

    public List<OrderItem> selectByOrderId(Long orderId) {
        return orderItemMapper.selectByOrderId(orderId);
    }
}

以上就是使用 Sharding-JDBC 实现水平分库+水平分表的完整攻略。下面提供两个示例代码:

  • 示例1:使用Sharding-JDBC实现水平分库+水平分表
// 分别向每个分片库中插入数据
OrderItem orderItem1 = new OrderItem();
orderItem1.setOrderId(1L);
orderItem1.setUserId(1);
orderItem1.setStatus("Payed");
orderItemService.insert(orderItem1);

OrderItem orderItem2 = new OrderItem();
orderItem2.setOrderId(2L);
orderItem2.setUserId(2);
orderItem2.setStatus("Delivered");
orderItemService.insert(orderItem2);

// 从分片库中查询数据
List<OrderItem> orderItemList = orderItemService.selectByOrderId(1L);
System.out.println(orderItemList);
  • 示例2:使用Sharding-JDBC进行事务管理
<!-- 开启Sharding事务管理器 -->
<bean id="shardingTransactionManager" class="io.shardingsphere.transaction.spring.ShardingTransactionManager" />

<!-- 注入代理数据源 -->
<bean id="dataSource" class="io.shardingsphere.spring.boot.datasource.SpringBootConfigurationDataSourceFactoryBean" />

<!-- 使用事务注解 -->
<tx:annotation-driven transaction-manager="shardingTransactionManager"/>

<!-- 为某个方法开启事务 -->
@Transactional
public void batchInsert(List<OrderItem> orderItemList) {
    for (OrderItem orderItem : orderItemList) {
        orderItemMapper.insert(orderItem);
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用sharding-jdbc实现水平分库+水平分表的示例代码 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • POI通过模板导出EXCEL文件的实例

    下面是详细的攻略: 一、准备工作 首先需要在项目的pom.xml文件中加上POI的依赖: <!– https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml –> <dependency> <groupId>org.apache.poi</groupId…

    Java 2023年6月15日
    00
  • JAVA对象JSON数据互相转换的四种常见情况

    JAVA对象JSON数据互相转换是日常开发中常见的需求之一,下面我们将讲解四种常见情况并给出相应示例说明。 1. JAVA对象转JSON数据 将JAVA对象转换成JSON格式的数据,一般使用JSON库来实现,比如Google Gson、Jackson等。 以Google Gson为例,使用方法如下: // 定义一个JAVA对象 public class Pe…

    Java 2023年5月26日
    00
  • Java实现对字符串中的数值进行排序操作示例

    下面我将详细讲解Java实现对字符串中的数值进行排序的完整攻略。 一、背景介绍 在Java中,字符串和数值之间的转换经常会用到,例如读取文件时,文件中的数值都是以字符串的形式呈现的,我们需要对这些数值进行排序等操作,这时就需要进行字符串和数值之间的转换。 二、Java字符串和数值的转换 Java中提供了许多方法来完成字符串和数值之间的转换,下面介绍一些常用的…

    Java 2023年5月19日
    00
  • Java8中的lambda表达式入门教程

    Java8中的Lambda表达式入门教程 什么是Lambda表达式 Lambda表达式是Java8中的新特性,它可以让我们更为简洁地表示实现接口方法的代码块,同时还支持函数式编程。Lambda表达式的本质是一个函数式接口实例的声明。 例如,我们常见的匿名内部类写法: new Thread(new Runnable(){ @Override public vo…

    Java 2023年5月23日
    00
  • Java时间工具类Date的常用处理方法

    下面是“Java时间工具类Date的常用处理方法”完整攻略: 一、Date类的创建方法 Date类的实例可以用以下两种方法创建: 1. 使用无参构造函数创建 Date date = new Date(); System.out.println(date); //2022-03-16 14:11:52 2. 使用long类型的构造函数创建,参数为从1970年1…

    Java 2023年5月20日
    00
  • Java常用JVM参数实战

    Java常用JVM参数实战 Java虚拟机(JVM)是Java语言的核心,它在执行Java程序时起到了关键的作用。Java虚拟机参数可以控制Java应用程序的各种执行行为,优化Java程序的性能和资源利用率。在本篇文章中,我将分享Java常用JVM参数的实际应用,分析它们的作用和效果。 本文主要包含以下几个方面: 启动JVM参数 Java虚拟机启动时通过设置…

    Java 2023年5月26日
    00
  • Java注解机制之Spring自动装配实现原理详解

    下面是详细的攻略。 Java注解机制之Spring自动装配实现原理详解 什么是Spring自动装配 Spring是一个开源框架,通过Spring框架,我们可以快速、简便地开发Java企业应用程序。其中,Spring IoC容器可以实现对象之间的依赖注入。Spring IoC容器可以根据注解或XML配置文件来管理和装配Bean。而Spring自动装配就是IoC…

    Java 2023年5月19日
    00
  • 解决idea2020.1找不到程序包和符号的问题

    问题背景: 在使用IntelliJ IDEA 2020.1时,有时会遇到找不到程序包和符号的问题。这个问题可能是由于项目依赖导致的,也可能是由于代码中的语法错误导致的。 解决方案: 检查项目依赖 首先,需要检查项目的依赖是否正确。在项目的pom.xml文件(Maven项目)或build.gradle文件(Gradle项目)中查看所依赖的库是否正确且版本是否匹…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部