Java ShardingJDBC实战演练

yizhihongxing

Java ShardingJDBC实战演练攻略

简介

Java ShardingJDBC是一款基于JDBC接口,以分库分表为核心的中间件。它通过JDBC驱动的方式,为应用程序提供了一套分布式数据库访问的解决方案。

在本文中,我们将详细介绍Java ShardingJDBC的使用方法和实战演练攻略。

1. 环境准备

在进行实战演练前,需要准备如下环境:

  • JDK 1.8及以上版本
  • Maven 3.0及以上版本
  • MySQL数据库
  • ShardingJDBC版本为4.0.1
  • SpringBoot版本为2.4.2

2. 示例说明

示例1:分库分表

在这个示例中,我们将演示如何通过Java ShardingJDBC实现分库分表。

步骤1:准备数据库

在这个示例中,我们需要准备2个MySQL数据库,每个数据库中分别创建2个表。

-- 数据库1
CREATE DATABASE db1 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

-- 用户表
CREATE TABLE user (
  id BIGINT NOT NULL AUTO_INCREMENT,
  name VARCHAR(50),
  age INT,
  PRIMARY KEY (id)
) ENGINE=InnoDB;

-- 商品表
CREATE TABLE goods (
  id BIGINT NOT NULL AUTO_INCREMENT,
  name VARCHAR(50),
  stock INT,
  PRIMARY KEY (id)
) ENGINE=InnoDB;

-- 数据库2
CREATE DATABASE db2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

-- 订单表
CREATE TABLE order (
  id BIGINT NOT NULL AUTO_INCREMENT,
  user_id BIGINT,
  goods_id BIGINT,
  amount INT,
  PRIMARY KEY (id)
) ENGINE=InnoDB;

-- 购物车表
CREATE TABLE cart (
  id BIGINT NOT NULL AUTO_INCREMENT,
  user_id BIGINT,
  goods_id BIGINT,
  amount INT,
  PRIMARY KEY (id)
) ENGINE=InnoDB;

步骤2:搭建SpringBoot工程

首先,我们需要在Maven中添加Sharding-JDBC和MySQL驱动的依赖:

<dependencies>
    <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        <version>4.0.1</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.22</version>
    </dependency>
</dependencies>

然后,我们需要在Spring Boot配置文件中添加如下配置:

spring:
  shardingsphere:
    datasource:
      names: ds0, ds1
      ds0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/db1?serverTimezone=UTC&useSSL=false
        username: root
        password: 123456
      ds1:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/db2?serverTimezone=UTC&useSSL=false
        username: root
        password: 123456
    sharding:
      tables:
        user:
          actualDataNodes: ds$->{0..1}.user_$->{0..1}
          tableStrategy:
            inline:
              shardingColumn: id
              algorithmExpression: user_$->{id % 2}
        goods:
          actualDataNodes: ds$->{0..1}.goods_$->{0..1}
          tableStrategy:
            inline:
              shardingColumn: id
              algorithmExpression: goods_$->{id % 2}
        order:
          actualDataNodes: ds$->{0..1}.order_$->{0..1}
          tableStrategy:
            inline:
              shardingColumn: id
              algorithmExpression: order_$->{id % 2}
        cart:
          actualDataNodes: ds$->{0..1}.cart_$->{0..1}
          tableStrategy:
            inline:
              shardingColumn: id
              algorithmExpression: cart_$->{id % 2}
      defaultDatabaseStrategy:
        inline:
          shardingColumn: id
          algorithmExpression: ds$->{id % 2}

在这个配置文件中,我们定义了两个数据源ds0和ds1,分别对应两个MySQL数据库。

对于每一张表,我们需要定义它在不同数据源中的实际数据节点,以及表的分片策略。在这个示例中,我们使用了基于id对2进行取模的方式进行分片。

最后,我们还需要定义默认的数据源和数据库分片策略。

步骤3:测试代码

在测试代码中,我们可以直接注入数据源,操作相应的表。

@RestController
public class UserController {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @GetMapping("/users")
    public List<Map<String, Object>> getUsers() {
        return jdbcTemplate.queryForList("SELECT * FROM user");
    }

    @PostMapping("/users")
    public String addUser(@RequestBody User user) {
        String sql = "INSERT INTO user(name, age) VALUES (?, ?)";
        jdbcTemplate.update(sql, user.getName(), user.getAge());
        return "success";
    }
}

示例2:读写分离

在这个示例中,我们将演示如何通过Java ShardingJDBC实现读写分离。

步骤1:准备数据库

在这个示例中,我们需要准备2个MySQL数据库,分别用于读写操作。

-- 主库
CREATE DATABASE db_master DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

-- 用户表
CREATE TABLE user (
  id BIGINT NOT NULL AUTO_INCREMENT,
  name VARCHAR(50),
  age INT,
  PRIMARY KEY (id)
) ENGINE=InnoDB;

-- 从库
CREATE DATABASE db_slave DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

-- 商品表
CREATE TABLE goods (
  id BIGINT NOT NULL AUTO_INCREMENT,
  name VARCHAR(50),
  stock INT,
  PRIMARY KEY (id)
) ENGINE=InnoDB;

步骤2:搭建SpringBoot工程

首先,我们需要在Maven中添加Sharding-JDBC和MySQL驱动的依赖:

<dependencies>
    <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        <version>4.0.1</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.22</version>
    </dependency>
</dependencies>

然后,我们需要在Spring Boot配置文件中添加如下配置:

spring:
  shardingsphere:
    datasource:
      names: ds_master, ds_slave
      ds_master:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/db_master?serverTimezone=UTC&useSSL=false
        username: root
        password: 123456
      ds_slave:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/db_slave?serverTimezone=UTC&useSSL=false
        username: root
        password: 123456
    sharding:
      defaultDatabaseStrategy:
        inline:
          shardingColumn: id
          algorithmExpression: ds_master
      masterSlaveRule:
        masterDataSourceName: ds_master
        slaveDataSourceNames:
          - ds_slave

在这个配置文件中,我们定义了两个数据源ds_master和ds_slave,分别对应主库和从库。

然后,我们还需要在sharding配置中指定默认的数据源,以及定义读写分离的规则。

步骤3:测试代码

在测试代码中,我们可以直接注入数据源,根据需要的操作类型分别使用主库或从库。

@Component
public class UserService {

    @Autowired
    private ShardingDataSource shardingDataSource;

    public List<Map<String, Object>> getUsers() {
        try (Connection connection = shardingDataSource.getConnection();
             PreparedStatement ps = connection.prepareStatement("SELECT * FROM user")) {
            ResultSet rs = ps.executeQuery();
            List<Map<String, Object>> resultList = new ArrayList<>();
            while (rs.next()) {
                Map<String, Object> resultMap = new HashMap<>();
                resultMap.put("id", rs.getLong("id"));
                resultMap.put("name", rs.getString("name"));
                resultMap.put("age", rs.getInt("age"));
                resultList.add(resultMap);
            }
            return resultList;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public void addUser(User user) {
        try (Connection connection = shardingDataSource.getConnection();
             PreparedStatement ps = connection.prepareStatement("INSERT INTO user(name, age) VALUES (?, ?)")) {
            ps.setString(1, user.getName());
            ps.setInt(2, user.getAge());
            ps.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

总结

通过以上两个示例,我们可以清晰地了解到Java ShardingJDBC的使用方法和实现原理。同时,我们也可以通过不同的分片策略,满足不同场景下的数据访问需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java ShardingJDBC实战演练 - Python技术站

(0)
上一篇 2023年6月16日
下一篇 2023年6月16日

相关文章

  • JSP使用自定义标签防止表单重复提交的方法

    JSP使用自定义标签防止表单重复提交的方法,可以通过以下步骤来实现: 第一步:编写防重复提交逻辑处理代码 在服务器端,可以编写逻辑处理代码,例如在Java Servlet的doGet()或doPost()方法中进行处理,避免重复提交表单。具体实现方式,可以在session中设置一个令牌token,每次提交表单时检查是否存在该令牌,如果存在则认为表单重复提交,…

    Java 2023年6月15日
    00
  • java可变参数当做数组处理的方法示例

    Java的可变参数可以让我们在定义方法时不确定参数的个数,这些参数被当做数组来处理,能够使方法的调用更加灵活方便。下面将为大家介绍Java可变参数当做数组处理的方法示例,具体步骤如下: 第一步:定义一个接收可变参数的方法 首先,我们需要在Java代码中定义一个接收可变参数的方法。以打印数组中所有元素为例,代码如下: public static void pr…

    Java 2023年5月26日
    00
  • MyBatis使用动态表或列代码解析

    针对”MyBatis使用动态表或列”这一话题,我将从以下几个方面为您进行详细讲解和解析: MyBatis动态表名的使用 MyBatis动态列名的使用 两条示例演示 1. MyBatis动态表名的使用 MyBatis提供了<foreach>标签来支持动态表名的使用。使用方法如下: <select id="queryTables&qu…

    Java 2023年5月20日
    00
  • Java C++ 算法题解leetcode652寻找重复子树

    Java C++ 算法题解leetcode652寻找重复子树 题目描述 给定一棵二叉树,返回所有重复子树的根节点,这些子树重复出现在原始的二叉树中。重复的子树意味着在同一位置具有相同的结构以及相同的节点值。 思路分析 我们需要类型为 Map 的一个 map,该 map 用于存储所有子树的出现次数。 我们对二叉树做一次后序遍历,得到一个标识了每一个子树的字符串…

    Java 2023年5月19日
    00
  • AngularJS教程之MVC体系结构详解

    首先,在讲解”MVC体系结构详解”之前,我们需要了解MVC的定义。MVC全称为Model View Controller,是一种软件设计模式,用于将应用程序响应用户操作、处理和存储数据的部分分离开来。 在AngularJS中,MVC模式可以详细地表述为: Model: 模型是应用程序的数据部分。它包括应用程序中使用的所有数据、规则、验证以及与数据交互的方法。…

    Java 2023年6月15日
    00
  • SpringMVC事件监听ApplicationListener实例解析

    SpringMVC事件监听ApplicationListener实例解析 SpringMVC事件监听是一种常见的技术,它可以帮助我们在SpringMVC应用程序中监听事件并执行一些操作。本文将详细讲解SpringMVC事件监听ApplicationListener的实例解析,并提供两个示例说明。 步骤一:创建事件 我们可以创建一个事件类,用于表示一个事件。下…

    Java 2023年5月18日
    00
  • Spring中的spring.factories文件用法(Spring如何加载第三方Bean)

    在Spring中,有一个特殊的配置文件spring.factories,它可以用于指定Spring加载的应用程序上下文中的第三方Bean,而无需创建XML配置文件。下面详细介绍它的用法和加载过程: spring.factories的用法 spring.factories文件位于Spring项目的META-INF目录中,并且遵循标准Java属性文件格式。该文件…

    Java 2023年5月31日
    00
  • Struts2学习笔记(6)-简单的数据校验

    针对这个话题,下面是一份完整攻略。 Struts2学习笔记(6)-简单的数据校验 前言 在Struts2中,数据校验是开发过程中不可缺少的一部分,而Struts2提供了全面而且灵活的校验机制来实现数据校验。在这篇文章中,我们将介绍Struts2中简单的数据校验。 配置数据校验 Struts2的校验机制主要是通过在Action类中定义方法进行校验,校验方法必须…

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