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

使用 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日

相关文章

  • vue 封装面包屑组件教程

    首先我们来介绍一下什么是面包屑(Breadcrumb)组件。面包屑组件是一种常用的导航方式,它能够让用户清楚地知道自己当前所处的位置以及所访问的路径。在前端框架中,Vue也提供了非常方便的封装方式来实现面包屑组件。 接下来,我们将按照以下步骤进行Vue面包屑组件的封装: 1. 创建面包屑组件 首先,在Vue项目中创建一个面包屑组件,它的基本结构如下: &lt…

    Java 2023年5月20日
    00
  • java中线程挂起的几种方式详解

    Java中线程挂起的几种方式详解 在Java中,我们可以通过挂起线程来实现线程的暂停,以便于进行一些特殊的处理。下面将介绍Java中线程挂起的几种方式。 1. 使用Thread.sleep() 调用Thread.sleep()方法可以让当前线程休眠指定的时间(以毫秒为单位)。例如,以下代码将让当前线程休眠5秒钟: try { Thread.sleep(500…

    Java 2023年5月19日
    00
  • mybatis分页绝对路径写法过程详解

    下面是关于”mybatis分页绝对路径写法过程详解”的完整攻略: 1.什么是Mybatis分页 Mybatis分页是指在数据库中查询出一批数据,然后将这批数据分页展示到页面上的一种技术。对于大数据量的系统来说,分页功能显得尤为重要。 2.Mybatis分页的实现 Mybatis分页有两种方式实现:传统方式和使用插件方式。这里重点讲解使用插件方式实现Mybat…

    Java 2023年6月15日
    00
  • Java Listener监听器使用规范详细介绍

    下面就是「Java Listener监听器使用规范详细介绍」的攻略: 什么是 Java Listener 监听器? Java Listener 监听器是一种设计模式,主要用于处理事件。事件可以是用户在程序中的交互(例如,单击按钮、选择菜单项等),也可以是由程序本身触发的事件(例如,资源加载完成、对象/文件/网络IO操作完成等)。 Java Listener …

    Java 2023年6月15日
    00
  • Java趣味练习题之输出两个日期之间的相隔天数

    以下是对应任务的完整攻略: 标题 题目:Java趣味练习题之输出两个日期之间的相隔天数 题目描述 给定两个日期,请输出两个日期之间相隔的天数。 思路 要求出两个日期之间相隔的天数,我们需要计算两个日期之间的天数差,而计算天数差的核心就是比较两个日期的大小。因此,我们可以将两个日期分别转换成毫秒数,然后通过毫秒数的差值,计算出两个日期之间相隔的天数。 具体实现…

    Java 2023年5月20日
    00
  • .Net集成敏感词组件的步骤

    针对“.Net集成敏感词组件的步骤”的完整攻略,我将从以下几个方面来进行详细的讲解: 确认需求和选择组件 下载和安装组件 集成敏感词组件到项目中 测试敏感词过滤功能 1. 确认需求和选择组件 在集成敏感词组件之前,我们首先需要确认项目中敏感词过滤的需求。比如:需要过滤哪些内容、过滤的规则等。确认好需求之后,就可以根据需求选择一个合适的敏感词组件。 目前比较常…

    Java 2023年6月15日
    00
  • Kafka源码系列教程之删除topic

    Kafka源码系列教程之删除topic 删除Kafka中的topic需要以下步骤: 关闭topic的所有消费者 停止所有的producer,确保没有新的消息被发布到该topic 从zookeeper中删除topic目录 从broker集群中删除该topic的所有分区 示例 1 假设我们要删除名为foo的topic。首先,我们需要查看哪些消费者正在订阅该top…

    Java 2023年5月20日
    00
  • javascript操作JSON的要领总结

    下面是关于“JavaScript操作JSON的要领总结”的完整攻略。 1. 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,由Douglas Crockford于2001年提出。JSON采用完全独立于语言的文本格式来表示数据,并且易于阅读和编写。JSON支持数字、布尔值、字符串、数组和对象的数据类型…

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