Java中ShardingSphere分库分表实战

关于Java中ShardingSphere分库分表的实战攻略,我将从以下几个方面进行讲解:

  1. 简介:什么是ShardingSphere分库分表
  2. 分库分表实战攻略:分库分表的具体实现步骤
  3. 示例1:如何使用ShardingSphere进行分库分表
  4. 示例2:如何根据业务自定义Sharding规则

1. 简介

ShardingSphere是一款非常流行的数据库分库分表中间件,它可以适用于各种主流的关系型数据库,包括MySQL、PostgreSQL、SQL Server等等。ShardingSphere通过对数据库的路由规则进行自定义,将数据切分成多个部分存储在不同的数据库以及表中,从而实现读写分离等一系列操作。

2. 分库分表实战攻略

下面是ShardingSphere分库分表的具体实现步骤:

  1. 引入ShardingSphere依赖

在pom.xml文件中,我们需要引入ShardingSphere的相关依赖,包括sharding-jdbc-core、sharding-jdbc-spring-boot-starter等等。

  1. 配置ShardingSphere规则

在application.yml文件中,我们需要配置ShardingSphere的分库分表规则,包括数据源配置、分库分表策略等等。

  1. 编写数据源

我们需要根据配置文件中的数据源信息,来创建对应的数据源类。

  1. 编写DAO层代码

在DAO层中,我们需要使用Spring JdbcTemplate来访问数据库,这样可以保证我们在ShardingSphere过程中的数据访问方式与传统方式一致。

3. 示例1

下面是一个使用ShardingSphere进行分库分表的示例:

  1. 引入依赖

首先,在pom.xml文件中添加如下依赖:

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-core</artifactId>
    <version>${shardingsphere.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>${shardingsphere.version}</version>
</dependency>

其中,${shardingsphere.version}表示ShardingSphere版本号。

  1. 配置数据源

在application.yml文件中配置如下数据源:

spring:
  shards:
    # 主库1配置
    -
      dataSources:
        ds_master:
          url: jdbc:mysql://localhost:3306/db0?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8
          username: root
          password: root
      tableRules:
        - !SHARDING_TABLE_LOGIC_NAME
          actualDataNodes: ds_master.tb_order_${0..1}
          tableStrategy:
            # 分表策略配置
            inline:
              # 分表列,这里以id为例
              shardingColumn: id
              # 分表算法
              algorithmExpression: tb_order_${id % 2}
      # 数据源名称
      dataSourceNames:
        - ds_master
    # 主库2配置
    -
      dataSources:
        ds_slave:
          url: jdbc:mysql://localhost:3306/db1?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8
          username: root
          password: root
      tableRules:
        - !SHARDING_TABLE_LOGIC_NAME
          actualDataNodes: ds_slave.tb_order_${0..1}
          tableStrategy:
            inline:
              shardingColumn: id
              algorithmExpression: tb_order_${id % 2}
      dataSourceNames:
        - ds_slave

# sharding jdbc 配置
sharding.jdbc:
  config:
    # 分库分表规则配置文件路径
    shardingConfigFile: shardingsphere.yaml

  1. 编写DAO层

在DAO层中,我们需要使用Spring JdbcTemplate来访问数据库,代码示例如下:

@Repository
public class OrderDAO {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<Order> listOrders() {
        return jdbcTemplate.query("SELECT * FROM tb_order", BeanPropertyRowMapper.newInstance(Order.class));
    }

    public Order queryOrderById(int id) {
        String sql = "SELECT * FROM tb_order WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, BeanPropertyRowMapper.newInstance(Order.class));
    }

    public int addOrder(Order order) {
        GeneratedKeyHolder holder = new GeneratedKeyHolder();
        jdbcTemplate.update(con -> {
            PreparedStatement ps = con.prepareStatement("INSERT INTO tb_order (user_id, remark, amount) VALUES (?, ?, ?)", Statement.RETURN_GENERATED_KEYS);
            ps.setInt(1, order.getUserId());
            ps.setString(2, order.getRemark());
            ps.setDouble(3, order.getAmount());
            return ps;
        }, holder);

        return holder.getKey().intValue();
    }
}

以上示例就是一个基于ShardingSphere实现的分库分表的示例。

4. 示例2

除此之外,我们还可以根据业务需求自定义Sharding规则,以下是一个根据一定规则自定义的分库分表Sharding规则:

  1. 自定义分库规则和分表规则
public class ModuloShardingDatabaseStrategy implements ShardingAlgorithm {
    private static final int DEFAULT_MODULO = 4;

    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames, ShardingValue shardingValue) {
        Collection<String> result = new HashSet<>(DEFAULT_MODULO);
        for (Object each : shardingValue.getValues()) {
            for (String tableName : availableTargetNames) {
                if (tableName.endsWith(String.format("_%02d", (((Long)each) % DEFAULT_MODULO)))){
                    result.add(tableName);
                }
            }
        }
        return result;
    }
}

public class ModuloShardingTableStrategy implements ShardingAlgorithm {
    private static final int DEFAULT_MODULO = 4;

    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames, ShardingValue shardingValue) {
        Collection<String> result = new HashSet<>(DEFAULT_MODULO);
        for (Object each : shardingValue.getValues()) {
            for (String tableName : availableTargetNames) {
                if (tableName.endsWith(String.format("_%02d", (((Long)each) % DEFAULT_MODULO)))){
                    result.add(tableName);
                }
            }
        }
        return result;
    }
}
  1. 数据源和表的配置
spring:
  datasource:
    driverClassName: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://localhost:3306/mytest?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8
    username: root
    password: root
  sharding:
    databases:
      names: ds_${0..3}
      ds_0:
        dsN_0:
          url: jdbc:mysql://localhost:3306/db_0?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8
          username: root
          password: root
        dsN_1:
          url: jdbc:mysql://localhost:3306/db_1?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8
          username: root
          password: root
      props:
        sql.show: true
    tables:
      tb_order_0:
        logicTable: tb_order
        actualDataNodes: ds_${0..3}.tb_order_${0..3}
        tableStrategy:
          inline:
            shardingColumn: id
            shardingAlgorithmName: tb_order_table_inline
        databaseStrategy:
          inline:
            shardingColumn: id
            shardingAlgorithmName: tb_order_database_inline
      tb_order_1:
        logicTable: tb_order
        actualDataNodes: ds_${0..3}.tb_order_${0..3}
        tableStrategy:
          inline:
            shardingColumn: id
            shardingAlgorithmName: tb_order_table_inline
        databaseStrategy:
          inline:
            shardingColumn: id
            shardingAlgorithmName: tb_order_database_inline
      tb_order_2:
        logicTable: tb_order
        actualDataNodes: ds_${0..3}.tb_order_${0..3}
        tableStrategy:
          inline:
            shardingColumn: id
            shardingAlgorithmName: tb_order_table_inline
        databaseStrategy:
          inline:
            shardingColumn: id
            shardingAlgorithmName: tb_order_database_inline
      tb_order_3:
        logicTable: tb_order
        actualDataNodes: ds_${0..3}.tb_order_${0..3}
        tableStrategy:
          inline:
            shardingColumn: id
            shardingAlgorithmName: tb_order_table_inline
        databaseStrategy:
          inline:
            shardingColumn: id
            shardingAlgorithmName: tb_order_database_inline

sharding.jdbc.config.shardingRuleConfiguration.overrides:
  - sqlShardingRule:
      automatic: false
    tables:
      tb_order:
        databaseStrategy:
          inline:
            shardingColumn: id
            shardingAlgorithmName: tb_order_database_inline
        tableStrategy:
          inline:
            shardingColumn: id
            shardingAlgorithmName: tb_order_table_inline
    bindingTables:
      - tb_order      

以上是针对ShardingSphere分库分表的实战攻略和2个示例讲解。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中ShardingSphere分库分表实战 - Python技术站

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

相关文章

  • 使用IDEA配置Mybatis-Plus框架图文详解

    下面是使用IDEA配置Mybatis-Plus框架的完整攻略。 步骤一:创建Maven项目并导入依赖 首先,我们需要在IDEA中创建一个Maven项目。创建项目后,我们需要在pom.xml文件中添加Mybatis-Plus相关的依赖。 <dependencies> <dependency> <groupId>com.bao…

    Java 2023年5月20日
    00
  • java环境变量如何配置

    下面是完整的Java环境变量配置攻略: 1. 下载Java运行环境 如果还没有下载Java运行环境版本,可以到Java官网下载,并按照提示安装。 2. 找到Java运行环境的路径 安装完成后,需要找到Java运行环境的安装路径。在Windows系统中,默认情况下,Java被安装在C:\Program Files\Java\目录下。在Mac OS或Linux系…

    Java 2023年5月26日
    00
  • asp.net开发微信公众平台之获取用户消息并处理

    我非常愿意为您讲解“asp.net开发微信公众平台之获取用户消息并处理”的完整攻略。 前置条件 在进行下面的步骤之前,您需要准备好以下前置条件: 一个搭建好的asp.net项目。 一个微信公众号。 在微信公众平台上获取到公众号的AppID和AppSecret。 安装WeChat SDK。 步骤1:获取微信服务器发送的消息 通过ASP.NET处理微信公众平台的…

    Java 2023年5月19日
    00
  • Spring Boot实现热部署的五种方式

    以下是详细讲解“Spring Boot实现热部署的五种方式”的完整攻略: 1.使用spring-boot-devtools Spring Boot提供了spring-boot-devtools工具让我们实现热部署。只需要将依赖添加到pom.xml文件中即可。 示例代码如下: 1.添加依赖 <dependency> <groupId>o…

    Java 2023年5月19日
    00
  • JavaWeb项目FullCalendar日历插件使用的示例代码

    下面是详细讲解JavaWeb项目中使用FullCalendar日历插件的攻略: 简介 FullCalendar是一款基于jQuery的开源工具,可以用来构建全功能、交互式日历和调度表。它可以用于Web应用程序、企业级管理系统、个人日历、日程安排等场景。使用FullCalendar可以快速高效地构建一个功能丰富的日历。下面是如何在JavaWeb项目中使用Ful…

    Java 2023年5月23日
    00
  • 微信小程序中如何计算距离某个节日还有多少天

    为了计算距离某个节日还有多少天,我们需要进行如下步骤: 1.获取当前时间 可以使用JavaScript中的Date对象来获取当前时间,通过调用Date类的构造器或静态方法即可完成,例如下面的代码实现获取当前时间: let currentTime = new Date(); 获取指定日期 我们可以通过手动指定特定日期来获取特定日期的Date对象,例如下面这段代…

    Java 2023年5月23日
    00
  • Java中的字符串用法小结

    Java中的字符串用法小结 简介 在Java中,String是一个非常重要的类。我们可以使用String类来表示一个字符串,并且这个字符串还有很多常用的操作方法。在本篇攻略中,我们将介绍如何使用String类来操作字符串,主要包括以下内容: 字符串的定义和赋值 字符串的比较 字符串的截取 字符串的替换 字符串的连接 字符串的定义和赋值 在Java中,字符串可…

    Java 2023年5月23日
    00
  • Mac系统中Apache Tomcat安装配置

    下面是 “Mac系统中Apache Tomcat安装配置” 的完整攻略: 准备工作 在开始安装和配置Apache Tomcat之前,需要确保你的Mac系统上已经安装了Java环境。同时,你需要知道以下几个信息: Apache Tomcat的版本号(例如8.5.65) Apache Tomcat的安装路径(例如/usr/local/tomcat) 安装Apac…

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