Sharding-JDBC自动实现MySQL读写分离的示例代码

下面我来详细讲解一下“Sharding-JDBC自动实现MySQL读写分离的示例代码”的完整攻略。

什么是Sharding-JDBC

Sharding-JDBC是一个基于JDBC的轻量级数据库中间件,能够完成Java应用程序中的数据分片,水平分片和读写分离等功能。

实现MySQL读写分离的步骤

步骤一:添加依赖

在项目的pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-core</artifactId>
    <version>4.1.1</version>
</dependency>
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-core-spring-boot-starter</artifactId>
    <version>4.1.1</version>
</dependency>
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-orchestration-spring-boot-starter</artifactId>
    <version>4.1.1</version>
</dependency>

步骤二:配置数据源

application.yml文件中配置数据源,如下所示:

spring:
  datasource:
    names: ds0,ds1
    ds0:
      url: jdbc:mysql://127.0.0.1:3306/test0?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC
      username: root
      password: root
    ds1:
      url: jdbc:mysql://127.0.0.1:3306/test1?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC
      username: root
      password: root

步骤三:添加Sharding-JDBC配置

application.yml文件中添加Sharding-JDBC配置,如下所示:

spring:
  shardingsphere:
    datasource:
      names: myshard
      myshard:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306
        username: root
        password:
        hikari:
          minimum-idle: 5
          maximum-pool-size: 50
    sharding:
      tables:
        user:
          actual-data-nodes: myshard.user_${0..1}
          table-strategy:
            inline:
              sharding-column: id
              algorithm-expression: user_${id % 2}
          key-generator:
            column: id
            type: SNOWFLAKE
        order:
          actual-data-nodes: myshard.order_${0..1}
          table-strategy:
            inline:
              sharding-column: id
              algorithm-expression: order_${id % 2}
          key-generator:
            column: id
            type: SNOWFLAKE
      default-database-strategy:
        inline:
          sharding-column: ds_name
          algorithm-expression: ds$->{id % 2}
      default-table-strategy:
        none:

步骤四:添加Mapper和Service

添加UserMapper和UserService,如下所示:

@Mapper
public interface UserMapper {
    @Insert("INSERT INTO user (name, age, gender) VALUES (#{name},#{age},#{gender})")
    int insert(User user);

    @Select("SELECT * from user WHERE id = #{id}")
    User getById(long id);
}
@Service
public class UserService {
    @Autowired
    UserMapper userMapper;

    @Transactional
    public void addUser(User user){
        userMapper.insert(user);
    }

    public User getUserById(long id){
        return userMapper.getById(id);
    }
}

步骤五:测试读写分离

在测试类中添加以下测试代码,测试Sharding-JDBC是否能够实现MySQL读写分离:

@SpringBootTest
class ShardingJdbcApplicationTests {
    @Autowired
    UserService userService;

    @Test
    void contextLoads() {
        User user = new User();
        user.setName("Tom");
        user.setAge(18);
        user.setGender("male");
        userService.addUser(user);

        User user1 = userService.getUserById(1);
        System.out.println(user1);
    }
}

以上代码就是Sharding-JDBC自动实现MySQL读写分离的示例代码。通过配置Sharding-JDBC实现数据分片和读写分离,从而提高数据库的读写性能和吞吐量。

示例

示例一:测试读写分离

在Sharding-JDBC自动实现MySQL读写分离的示例代码中,添加以下测试代码,测试Sharding-JDBC是否能够实现MySQL读写分离:

@SpringBootTest
class ShardingJdbcApplicationTests {
    @Autowired
    UserService userService;

    @Test
    void contextLoads() {
        User user = new User();
        user.setName("Tom");
        user.setAge(18);
        user.setGender("male");
        userService.addUser(user);

        User user1 = userService.getUserById(1);
        System.out.println(user1);
    }
}

以上代码执行后,会向数据库插入一条记录,并从数据库中查询出这条记录。

示例二:测试分片策略

在Sharding-JDBC自动实现MySQL读写分离的示例代码中,修改application.yml文件中的分片策略,如下所示:

spring:
  shardingsphere:
    datasource:
      names: myshard
      myshard:
        ...
        hikari:
          minimum-idle: 5
          maximum-pool-size: 50
    sharding:
      tables:
        user:
          actual-data-nodes: myshard.user${0..1}.user_${0..1}
          table-strategy:
            complex:
              sharding-columns: id,gender
              algorithm-class-name: com.example.demo.algorithm.ModuloShardingAlgorithm
          key-generator:
            column: id
            type: SNOWFLAKE
      ...

同时,修改ModuloShardingAlgorithm类的具体实现,如下所示:

public class ModuloShardingAlgorithm implements ComplexKeysShardingAlgorithm<Long> {

    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames, ComplexKeysShardingValue<Long> shardingValue) {
        Set<String> result = new HashSet<>();
        for (Long value : shardingValue.getColumnNameAndShardingValuesMap().get("gender")) {
            String suffix = value % 2 + "_" + shardingValue.getColumnNameAndShardingValuesMap().get("id").iterator().next() % 2;
            for (String name : availableTargetNames) {
                if (name.endsWith(suffix)) {
                    result.add(name);
                }
            }
        }
        return result;
    }
}

以上修改的分片策略是基于id和gender两个字段进行分片,其中id字段按照2个一组进行分片,gender字段按照值的模2进行分片。

修改完成后,重新执行测试类中的测试方法,验证Sharding-JDBC是否能够按照新的分片策略进行数据分片。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Sharding-JDBC自动实现MySQL读写分离的示例代码 - Python技术站

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

相关文章

  • Java对象转换的方案分享

    下面就给大家详细讲解一下Java对象转换的方案分享,内容主要包括以下几个方面: 为什么需要Java对象转换 常见的Java对象转换方式和工具 示例说明:使用Jackson工具进行对象转换 示例说明:手动编写代码进行对象转换 1. 为什么需要Java对象转换 Java中的对象通常有很多种类型,比如字符串、数字、日期、自定义对象等等。在编程的过程中,我们可能需要…

    Java 2023年5月26日
    00
  • 关于jsp页面使用jstl的异常分析

    关于jsp页面使用jstl的异常分析,我们可以分为以下几个部分来详细讲解: 1. 确认项目中是否引入了jstl标签库 使用jstl标签库需要我们先在项目中引入jstl标签库的Jar包。在Maven项目中可以在pom.xml中添加以下依赖: <dependency> <groupId>javax.servlet</groupId&…

    Java 2023年6月15日
    00
  • Java面试题冲刺第五天–基础篇2

    Java面试题冲刺第五天–基础篇2 一、问题1:数组的长度、容量和元素个数有什么区别? 答案 数组的长度(length):数组长度是确定且不可改变的,是数组定义的时候就确定好的,可以通过引用名称加.length获得。 数组的容量:数组容量和数组长度没有什么关系,当数组被初始化后,容量一旦被确定就无法更改。数组容量大小是指JVM为了让数组能够并发访问而在内存…

    Java 2023年5月26日
    00
  • Java 实战项目之疫情防控管理系统详解

    Java 实战项目之疫情防控管理系统详解 1. 项目介绍 该项目是一个基于Java的疫情防控管理系统。通过该系统,用户可以实现疫情病例的查询、疫情防控信息的发布和员工健康信息的管理等功能。 2. 技术栈 2.1 前端技术栈 HTML/CSS/JavaScript jQuery Bootstrap 2.2 后端技术栈 Java Spring/Spring MV…

    Java 2023年5月23日
    00
  • js内置对象 学习笔记

    我们来详细讲解一下JS内置对象的学习笔记。 标准内置对象 JS内置对象指的是在JS语言标准中定义的对象,以全局作用域之下的属性形式存在。可以分为以下几类: 基本数据类型(Number、String、Boolean、Symbol、BigInt、null、undefined) 内置对象(Array、Date、RegExp、Promise、Proxy、Map、Se…

    Java 2023年5月26日
    00
  • java使用jdbc连接数据库工具类和jdbc连接mysql数据示例

    使用Java连接数据库一般都会使用Java Database Connectivity(JDBC)技术。JDBC 是一种Java提供的标准化的数据库操作接口,支持多种数据库,包括MySQL、Oracle、SQL Server等等。在Java中,使用JDBC编写程序连接数据库是比较常见的,接下来详细讲解一下如何使用 JDBC 连接 MySQL 数据库及其工具类…

    Java 2023年5月19日
    00
  • Java中Spring的单例模式使用

    Java中Spring的单例模式使用可以说是Spring框架中最常用的一种设计模式,它通过保持一个对象的唯一实例,来使得在系统中所有需要该对象的地方都共享同一个实例。 下面我将详细介绍Java中Spring的单例模式使用的完整攻略,并提供两个代码示例以帮助理解。 1. Spring的单例模式使用背景 首先,我们需要了解Spring框架的单例模式使用背景。 在…

    Java 2023年5月19日
    00
  • java实现简单图书管理系统

    Java实现简单图书管理系统完整攻略 背景介绍 随着数字化时代的来临,人们倾向于利用计算机来管理综合信息。图书管理系统是一种管理图书库存、记录图书信息、查询图书信息、借阅和交还图书等方面的软件系统,它可以帮助图书馆实现书籍信息的自动化处理和管理。Java语言是一种优秀的编程语言,其特点包括跨平台性、面向对象、易学易用等,适合开发这种类型的系统。 系统架构 简…

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